Chromium Chronicle #15:限制目标可见性

第 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>

资源