Chromium Chronicle #15: Hedef Görünürlüğü Kısıtlama

Bölüm 15: - Montreal'den Joe Mason, PQ (Kasım 2020)
Önceki bölümler

Chrome, birçok alt sistemi olan büyük bir projedir. Başka bir yerde işe yarayabilecek, ancak gizli kısıtlamaları olan bir bileşen için yazılmış kod bulmak yaygın bir durumdur. Güvenlik için tehlikeli işlevlere dışarıdan erişimi sınırlandırın. Örneğin, belirli performans ihtiyaçları için ayarlanmış özel bir işlev:

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

Erişimi kısıtlamanın birkaç yolu vardır. GN görünürlük kuralları, bir hedefe bağlı olarak bileşeninizin dışındaki kodun durmasını sağlar. Varsayılan olarak hedefler herkes tarafından görülebilir, ancak bunları değiştirebilirsiniz:

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

Görünürlük beyanları, her GN derlemesinin bir parçası olarak çalışan gn check ile doğrulanır.

Bir başka mekanizma da üstbilgi dosyalarına erişimi sınırlayan DEPS include_rules'dir. Her dizin include_rules öğesini üst öğesinden devralır ve bu kuralları kendi DEPS dosyasında değiştirebilir. Dış dizinlerden dahil edilen tüm üstbilgi dosyalarına include_rules tarafından izin verilmelidir.

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

Bu bağımlılıkların uygun olduğundan emin olmak için include_rules öğesine bir dizin ekleyen değişiklikler ilgili dizinin OWNERS tarafından onaylanmalıdır. include_rules kullanılarak bir dizini kısıtlamak için onay gerekmez. Belirli başlıklara teklif vermek için include_rule ekleyerek bileşeninizi değiştiren herkesin belirli başlıkları kullanmamalarını hatırlamasını sağlayabilirsiniz.

include_rules, ön gönderme tarafından kontrol edilir. Dolayısıyla, bir değişiklik yüklemeyi deneyene kadar herhangi bir hata görmezsiniz. include_rules uygulamasını yüklemeden test etmek için buildtools/checkdeps/checkdeps.py <directory> komutunu çalıştırın.

Kaynaklar