Chromium Chronicle #15: Membatasi Visibilitas Target

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>.

Resource