Chromium Chronicle Nr. 15: Sichtbarkeit von Zielen einschränken

Folge 15: von Joe Mason in Montreal, PQ (November 2020)
Vorherige Folgen

Chrome ist ein großes Projekt mit vielen Subsystemen. Häufig wird Code die an anderer Stelle nützlich sein könnten, Einschränkungen. Aus Sicherheitsgründen sollten Sie den externen Zugriff auf gefährliche Funktionen einschränken. Zum Beispiel eine benutzerdefinierte Funktion, die auf bestimmte Leistungsanforderungen abgestimmt ist:

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

Es gibt mehrere Möglichkeiten, den Zugriff einzuschränken. Stoppcode für die GN-Sichtbarkeitsregeln außerhalb der Komponente von einem Ziel abhängig ist. Standardmäßig sind die Ziele für alle sichtbar, aber Sie können dies ändern:

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

Deklarationen zur Sichtbarkeit werden mit gn check validiert, das als Teil von jedem GN-Build.

Ein weiterer Mechanismus ist DEPS include_rules, der den Zugriff auf Headerdateien begrenzt. Jedes Verzeichnis übernimmt die include_rules vom übergeordneten Verzeichnis und kann diese ändern Regeln in einer eigenen DEPS-Datei. Alle Headerdateien von außerhalb eingeschlossen müssen von include_rules zugelassen sein.

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

Um sicherzustellen, dass diese Abhängigkeiten angemessen sind, Änderungen, durch die ein Verzeichnis hinzugefügt wird, an include_rules muss vom OWNERS dieses Verzeichnisses genehmigt werden. Nein Zum Einschränken eines Verzeichnisses mit include_rules ist eine Genehmigung erforderlich. Sie können dass alle, die Ihre Komponente ändern, daran erinnern, bestimmte -Header, indem Sie eine include_rule-Anweisung für die Gebotsabgabe hinzufügen.

include_rules werden beim Vorabsenden geprüft. Daher sehen Sie keine bis Sie versuchen, eine Änderung hochzuladen. Zum Testen von include_rules ohne wird hochgeladen, buildtools/checkdeps/checkdeps.py <directory> ausführen.

Ressourcen