Chromium Chronicle #15: محدود کردن دید هدف

قسمت 15: توسط جو میسون در مونترال، پی کیو (نوامبر، 2020)
قسمت های قبلی

کروم پروژه بزرگی است که زیرسیستم های زیادی دارد. یافتن کد نوشته شده برای یک مؤلفه که در جای دیگر مفید است، اما ممکن است محدودیت های پنهان داشته باشد، معمول است. برای ایمنی، دسترسی خارجی را به عملکرد خطرناک محدود کنید . به عنوان مثال، یک تابع سفارشی تنظیم شده برای نیازهای عملکردی خاص:

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

راه های مختلفی برای محدود کردن دسترسی وجود دارد. قوانین نمایان بودن GN کد خارج از مؤلفه شما را بسته به هدف متوقف می کند . به طور پیش فرض اهداف برای همه قابل مشاهده است، اما می توانید آن را تغییر دهید:

# In components/restricted_component/BUILD.gn
visibility = [
  # Applies to all targets in this file.
  # Only the given targets can depend on them.
  "//components/restricted_component:*",
  "//components/authorized_other_component:a_single_target",
]
source_set("internal") {
  # This dangerous target should be locked down even more.
  visibility = [ "//components/restricted_component:privileged_target" ]
}

اعلان‌های دید با gn check ، که به عنوان بخشی از هر ساخت GN اجرا می‌شود، اعتبارسنجی می‌شوند.

مکانیزم دیگر DEPS include_rules است که دسترسی به فایل های هدر را محدود می کند . هر دایرکتوری include_rules از والد خود به ارث می برد و می تواند آن قوانین را در فایل DEPS خود تغییر دهد. همه فایل‌های سرصفحه شامل فهرست‌های خارج از فهرست باید توسط include_rules مجاز باشند.

# In //components/authorized_other_component/DEPS
include_rules = [
  # Common directories like //base are inherited from
  # //components/DEPS or //DEPS. Also allow includes from
  # restricted_component, but not restricted_component/internal.
  "+components/restricted_component",
  "-components/restricted_component/internal",
  # But do allow a single header from internal, for testing.
  "+components/restricted_component/internal/test_support.h",
]

برای اطمینان از مناسب بودن این وابستگی ها، تغییراتی که دایرکتوری را به include_rules اضافه می کند باید توسط OWNERS آن دایرکتوری تایید شود . برای محدود کردن دایرکتوری با استفاده از include_rules نیازی به تایید نیست! می‌توانید اطمینان حاصل کنید که هرکسی که مؤلفه شما را تغییر می‌دهد به خاطر می‌آورد که از سرصفحه‌های خاصی استفاده نکند، با افزودن یک include_rule که آنها را ممنوع می‌کند.

include_rules توسط پیش ارسال بررسی می شود ، بنابراین تا زمانی که سعی نکنید یک تغییر را آپلود کنید، هیچ خطایی را مشاهده نخواهید کرد. برای آزمایش include_rules بدون آپلود، buildtools/checkdeps/checkdeps.py <directory> را اجرا کنید.

منابع