Episodio 15: di Joe Mason a Montreal, PQ (novembre 2020)
Puntate precedenti
Chrome è un grande progetto con molti sottosistemi. È frequente trovare codice scritto per un componente che sarebbe utile altrove, ma che potrebbe essere stato nascosto limitazioni. Per motivi di sicurezza, limita l'accesso esterno alle funzionalità pericolose. Ad esempio, una funzione personalizzata ottimizzata per esigenze di prestazioni specifiche:
// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);
Esistono diversi modi per limitare l'accesso. Codice di interruzione delle regole di visibilità GN all'esterno del componente, in base a un target. Per impostazione predefinita, i target sono visibile a tutti, ma che puoi modificare:
# 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" ]
}
Le dichiarazioni di visibilità sono convalidate con gn check
, che viene eseguito come parte
di ogni build GN.
Un altro meccanismo è il DEPS include_rules
, che limita l'accesso ai file di intestazione.
Ogni directory eredita include_rules
dall'elemento padre e può modificarle
nel proprio file DEPS
. Tutti i file di intestazione inclusi dall'esterno
devono essere consentite dall'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",
]
Per garantire che queste dipendenze siano appropriate, le modifiche che aggiungono una directory
a include_rules
deve essere approvato dal OWNERS
di quella directory. No
è necessaria l'approvazione per limitare una directory utilizzando include_rules
. Puoi
assicurati che chiunque modifichi il tuo componente ricordi di non utilizzare
aggiungendo un include_rule
che ne impedisce le offerte.
include_rules
sono selezionati prima dell'invio, quindi non vedrai nessuna
errori finché non provi a caricare una modifica. Per testare include_rules
senza
caricamento, esegui buildtools/checkdeps/checkdeps.py <directory>
.