第 15 集:乔·梅森 (Joe Mason) 在蒙特利尔(PQ,2020 年 11 月)
上一集
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
进行验证,它作为
。
另一种机制是 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",
]
为确保这些依赖项合适,将添加目录的更改
必须获得相应目录的OWNERS
的批准,才能发布到include_rules
。否
需要获得批准才能使用 include_rules
限制目录!您可以
请确保更改组件的每个人都谨记不要使用特定的
标头,方法是添加一个 include_rule
来禁止它们。
include_rules
在提交前会进行检查,因此您不会看到任何
错误,除非您尝试上传更改。要在不使用include_rules
的情况下测试
正在上传,请运行 buildtools/checkdeps/checkdeps.py <directory>
。