Episode 15: oleh Joe Mason di Montreal, PQ (November 2020)
Episode sebelumnya
Chrome adalah proyek besar dengan banyak subsistem. Merupakan hal yang umum untuk menemukan kode ditulis untuk satu komponen yang akan berguna di tempat lain, tetapi mungkin tersembunyi pembatasan. Demi keamanan, batasi akses eksternal ke fungsi berbahaya. Misalnya, fungsi kustom yang disesuaikan untuk kebutuhan performa tertentu:
// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);
Ada beberapa cara untuk membatasi akses. Kode perhentian aturan visibilitas GN luar komponen Anda, agar tidak bergantung pada target. Secara default, target adalah terlihat oleh semua orang, tetapi Anda dapat mengubahnya:
# 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" ]
}
Deklarasi visibilitas divalidasi dengan gn check
, yang berjalan sebagai bagian
dari setiap build GN.
Mekanisme lainnya adalah DEPS include_rules
, yang membatasi akses ke file header.
Setiap direktori mewarisi include_rules
dari induknya, dan dapat mengubahnya
aturan dalam file DEPS
-nya sendiri. Semua file header yang disertakan dari luar
direktori harus diizinkan oleh 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",
]
Untuk memastikan dependensi ini sesuai, perubahan yang menambahkan direktori
ke include_rules
harus disetujui oleh OWNERS
direktori tersebut. Lain kali
persetujuan diperlukan untuk membatasi direktori menggunakan include_rules
. Anda dapat
memastikan bahwa setiap orang yang mengubah
komponen Anda ingat untuk tidak menggunakan
dengan menambahkan include_rule
yang melarangnya.
include_rules
diperiksa oleh pra-pengiriman, sehingga Anda tidak akan melihat
error hingga Anda mencoba mengupload perubahan. Untuk menguji include_rules
tanpa
mengupload, jalankan buildtools/checkdeps/checkdeps.py <directory>
.