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

ตอนที่ 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 ซึ่งทำงานเป็นส่วนหนึ่งของบิลด์ 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",
]

เพื่อให้ทรัพยากร Dependency เหล่านี้มีความเหมาะสม การเปลี่ยนแปลงที่เพิ่มไดเรกทอรีไปยัง include_rules จะต้องได้รับการอนุมัติจาก OWNERS ของไดเรกทอรีดังกล่าว ไม่จำเป็นต้องมีการอนุมัติเพื่อจำกัดไดเรกทอรีโดยใช้ include_rules! คุณมั่นใจได้ว่าทุกคนที่เปลี่ยนคอมโพเนนต์จำได้ว่าจะไม่ใช้ส่วนหัวบางรายการโดยเพิ่ม include_rule สำหรับการเสนอราคาส่วนหัวดังกล่าว

include_rules จะได้รับการตรวจสอบโดยการส่งล่วงหน้า คุณจึงจะไม่เห็นข้อผิดพลาดจนกว่าจะอัปโหลดการเปลี่ยนแปลง หากต้องการทดสอบ include_rules โดยไม่ต้องอัปโหลด ให้เรียกใช้ buildtools/checkdeps/checkdeps.py <directory>

แหล่งข้อมูล