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

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

Chrome ist ein großes Projekt mit vielen Subsystemen. Es kommt häufig vor, dass Code für eine Komponente geschrieben wird, der an anderer Stelle nützlich wäre, aber versteckte Einschränkungen haben kann. Aus Sicherheitsgründen sollten Sie den externen Zugriff auf gefährliche Funktionen beschränken. Eine benutzerdefinierte Funktion, die auf bestimmte Leistungsanforderungen abgestimmt ist, könnte zum Beispiel so aussehen:

// 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. GN-Sichtbarkeitsregeln verhindern, dass Code außerhalb Ihrer Komponente von einem Ziel abhängig ist. Standardmäßig sind Ziele für alle sichtbar. Sie können dies jedoch ä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" ]
}

Sichtbarkeitsdeklarationen werden mit gn check validiert, das bei jedem GN-Build ausgeführt wird.

Ein weiterer Mechanismus ist DEPS include_rules, der den Zugriff auf Headerdateien beschränkt. Jedes Verzeichnis übernimmt include_rules vom übergeordneten Verzeichnis und kann diese Regeln in einer eigenen DEPS-Datei ändern. Alle Headerdateien, die aus externen Verzeichnissen stammen, müssen vom include_rules zugelassen werden.

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

Damit diese Abhängigkeiten angemessen sind, müssen Änderungen, durch die ein Verzeichnis zu include_rules hinzugefügt wird, vom OWNERS dieses Verzeichnisses genehmigt werden. Zum Einschränken eines Verzeichnisses mit include_rules ist keine Genehmigung erforderlich. Wenn Sie dafür sorgen, dass alle Personen, die Ihre Komponente ändern, daran denken, bestimmte Header nicht zu verwenden, fügen Sie ein include_rule hinzu, das diese verhindert.

include_rules werden von der Vorabübermittlung geprüft. Daher sehen Sie erst Fehler, wenn Sie versuchen, eine Änderung hochzuladen. Wenn Sie include_rules ohne Upload testen möchten, führen Sie buildtools/checkdeps/checkdeps.py <directory> aus.

Ressourcen