Chromium Chronicle #15: Membatasi Visibilitas Target

Episode 15: oleh Joe Mason di Montreal, PQ (November, 2020)
Episode sebelumnya

Chrome adalah proyek besar dengan banyak sub-sistem. Sangat umum untuk menemukan kode yang ditulis untuk satu komponen yang akan berguna di tempat lain, tetapi mungkin memiliki batasan tersembunyi. 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. Aturan visibilitas GN menghentikan kode di luar komponen Anda agar tidak bergantung pada target. Secara default, target 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 mengubah aturan tersebut 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. Tidak diperlukan persetujuan untuk membatasi direktori menggunakan include_rules. Anda dapat memastikan bahwa semua orang yang mengubah komponen Anda ingat untuk tidak menggunakan header tertentu dengan menambahkan include_rule yang melarang mereka.

include_rules diperiksa oleh pra-pengiriman, sehingga Anda tidak akan melihat error apa pun sampai Anda mencoba mengupload perubahan. Untuk menguji include_rules tanpa mengupload, jalankan buildtools/checkdeps/checkdeps.py <directory>.

Referensi