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>

แหล่งข้อมูล