Chromium Chronicle #15: Hạn chế chế độ hiển thị mục tiêu

Tập 15: của Joe Mason ở Montreal, PQ (Tháng 11 năm 2020)
Các tập trước

Chrome là một dự án lớn có nhiều hệ thống phụ. Thông thường, bạn sẽ thấy mã được viết cho một thành phần hữu ích ở nơi khác, nhưng có thể có các hạn chế ẩn. Để đảm bảo an toàn, hãy giới hạn quyền truy cập bên ngoài vào các chức năng nguy hiểm. Ví dụ: một hàm tuỳ chỉnh được điều chỉnh theo nhu cầu cụ thể về hiệu suất:

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

Có một số cách để hạn chế quyền truy cập. Quy tắc hiển thị GN ngăn mã bên ngoài thành phần phụ thuộc vào một mục tiêu. Theo mặc định, tất cả mọi người đều có thể nhìn thấy các mục tiêu, nhưng bạn có thể sửa đổi điều đó:

# 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" ]
}

Nội dung khai báo về chế độ hiển thị được xác thực bằng gn check, chạy trong mọi bản dựng GN.

Một cơ chế khác là DEPS include_rules, cơ chế này giới hạn quyền truy cập vào các tệp tiêu đề. Mọi thư mục đều kế thừa include_rules từ thư mục gốc và có thể sửa đổi các quy tắc đó trong tệp DEPS của riêng thư mục đó. Tất cả các tệp tiêu đề được bao gồm từ các thư mục bên ngoài phải được include_rules cho phép.

# 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",
]

Để đảm bảo các phần phụ thuộc này là phù hợp, những thay đổi thêm một thư mục vào include_rules phải được OWNERS của thư mục đó phê duyệt. Không cần phê duyệt để hạn chế thư mục bằng include_rules! Bạn có thể đảm bảo rằng tất cả những người thay đổi thành phần của bạn sẽ nhớ không sử dụng một số tiêu đề nhất định bằng cách thêm include_rule để cấm các tiêu đề đó.

include_rules được kiểm tra qua lần gửi trước. Vì vậy, bạn sẽ không thấy lỗi nào cho đến khi cố gắng tải một thay đổi lên. Để kiểm thử include_rules mà không tải lên, hãy chạy buildtools/checkdeps/checkdeps.py <directory>.

Tài nguyên