Chromium Chronicle n.o 15: Restringe la visibilidad de los objetivos

Episodio 15: de Joe Mason en Montreal, PQ (noviembre de 2020)
Episodios anteriores

Chrome es un proyecto grande que tiene muchos subsistemas. Es común encontrar código escrita para un componente que sería útil en otro lugar, pero que podría haber de manera predeterminada. Por seguridad, limita el acceso externo a funciones peligrosas. Por ejemplo, una función personalizada ajustada a necesidades de rendimiento específicas:

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

Existen varias formas de restringir el acceso. Código de detención de las reglas de visibilidad de GN fuera de tu componente dependiendo de un objetivo. De forma predeterminada, los objetivos son los siguientes: visible para todos, pero puedes modificar esto:

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

Las declaraciones de visibilidad se validan con gn check, que se ejecuta como parte de cada compilación de GN.

Otro mecanismo es DEPS include_rules, que limita el acceso a los archivos de encabezado. Cada directorio hereda include_rules de su elemento superior y puede modificarlos en su propio archivo DEPS. Todos los archivos de encabezado incluidos desde afuera directorios deben estar permitidos por 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",
]

Para asegurarte de que estas dependencias sean apropiadas, los cambios que agregan un directorio a include_rules debe tener la aprobación del OWNERS de ese directorio. No se necesita aprobación para restringir un directorio con include_rules. Puedes asegurarte de que todos los que cambien el componente recuerden no utilizar ciertos encabezados agregando una include_rule que los prohíba.

include_rules se verifican en el envío previo, por lo que no verás ningún mensaje errores hasta que intente subir un cambio. Para probar include_rules sin subiendo, ejecuta buildtools/checkdeps/checkdeps.py <directory>.

Recursos