פרק 15: מאת Joe Mason במונטריאול, 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>
.