Chromium Chronicle מס' 15: הגבלת החשיפה של היעד

פרק 15: מאת ג'ו מייסון במונטריאול, PQ (נובמבר 2020)
פרקים קודמים

Chrome הוא פרויקט גדול עם הרבה מערכות משנה. מקובל למצוא קוד שנכתב עבור רכיב אחד, שעשוי להיות שימושי במקומות אחרים, אבל יכול להיות שיש לו מגבלות נסתרות. מטעמי בטיחות, כדאי להגביל את הגישה החיצונית לפונקציונליות מסוכנת. לדוגמה, פונקציה מותאמת אישית שמכווננת לצורכי ביצועים ספציפיים:

// 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, שפועל כחלק מכל build של 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>.

מקורות מידע