The Chromium Chronicle #15: การจำกัดระดับการเข้าถึงเป้าหมาย

ตอนที่ 15: โดย Joe Mason in Montreal, 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 ซึ่งทํางานเป็นส่วนหนึ่ง ของ 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>

แหล่งข้อมูล