De Chromium Chronicle #15: De zichtbaarheid van doelen beperken

Aflevering 15: door Joe Mason in Montreal, PQ (november 2020)
Vorige afleveringen

Chrome is een groot project met veel subsystemen. Het is gebruikelijk om code te vinden die voor één component is geschreven en die elders nuttig zou kunnen zijn, maar mogelijk verborgen beperkingen heeft. Beperk voor de veiligheid externe toegang tot gevaarlijke functionaliteit . Bijvoorbeeld een aangepaste functie die is afgestemd op specifieke prestatiebehoeften:

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

Er zijn verschillende manieren om de toegang te beperken. GN-zichtbaarheidsregels voorkomen dat code buiten uw component afhankelijk is van een doel . Standaard zijn doelen voor iedereen zichtbaar, maar u kunt dit wijzigen:

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

Zichtbaarheidsverklaringen worden gevalideerd met gn check , dat wordt uitgevoerd als onderdeel van elke GN-build.

Een ander mechanisme is DEPS include_rules , dat de toegang tot headerbestanden beperkt . Elke map erft include_rules van zijn bovenliggende map, en kan deze regels in zijn eigen DEPS bestand wijzigen. Alle headerbestanden die van buiten mappen zijn opgenomen, moeten worden toegestaan ​​door de 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",
]

Om ervoor te zorgen dat deze afhankelijkheden geschikt zijn, moeten wijzigingen die een map toevoegen aan include_rules worden goedgekeurd door de OWNERS van die map . Er is geen goedkeuring nodig om een ​​map te beperken met behulp van include_rules ! U kunt ervoor zorgen dat iedereen die uw component wijzigt, onthoudt bepaalde headers niet te gebruiken door een include_rule toe te voegen die deze verbiedt.

include_rules worden gecontroleerd door presubmit , zodat u geen fouten ziet totdat u een wijziging probeert te uploaden. Als u include_rules wilt testen zonder te uploaden, voert u buildtools/checkdeps/checkdeps.py <directory> uit.

Bronnen