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 con muchos subsistemas. Es común encontrar código escrito para un componente que sería útil en otro lugar, pero puede tener restricciones ocultas. Por motivos de seguridad, limita el acceso externo a las 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. Las reglas de visibilidad de GN impiden que el código fuera de tu componente dependa de un objetivo. De forma predeterminada, todos los destinos son visibles para todos, pero puedes modificarlo:

# 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 encabezados. Cada directorio hereda include_rules de su elemento superior y puede modificar esas reglas en su propio archivo DEPS. include_rules debe permitir todos los archivos de encabezado incluidos desde directorios externos.

# 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 garantizar que estas dependencias sean apropiadas, el OWNERS de ese directorio debe aprobar los cambios que agreguen un directorio a include_rules. No se necesita aprobación para restringir un directorio con include_rules. Para asegurarte de que todas las personas que cambien tu componente recuerden no usar ciertos encabezados, agrega un include_rule que los prohíba.

El envío previo verifica las include_rules, por lo que no verás ningún error hasta que intentes subir un cambio. Para probar include_rules sin subirlo, ejecuta buildtools/checkdeps/checkdeps.py <directory>.

Recursos