Sıfır Başlatılmış Bellek

C ve C++'da başlatılmamış bellek, güvenilirlik sorunlarının, bellek güvenliği hatalarının ve bilgi sızıntılarının yaygın bir nedenidir. Bu sorunları önlemek için Android mümkün olduğu kadar çok belleği başlatır.

Sıfır başlatılan kullanıcı alanı belleği

Android 12'den bu yana, yığın belleği tüm platform yerel kodlarında (JNI dahil) sıfır olarak başlatılmıştır ve yığın belleği tüm platform yerel işlemlerinde ( netd gibi) sıfır olarak başlatılmıştır, ancak zygote veya uygulamalarda bu durum söz konusu değildir.

NDK ile oluşturulan birinci ve üçüncü taraf uygulamaların, yığın yerel değişkenlerini sıfırlamak için -ftrivial-auto-var-init=zero derleyici bayrağını kullanmaları önemle tavsiye edilir. Derleyici gereksiz sıfırlamaları optimize eder. Örneğin, yerel bir değişken açıkça başlatıldığında (örneğin, int x = 123; x değişkeni yalnızca bir kez başlatılır). Programın performans etkin noktasında büyük bir yığın arabelleği varsa geliştirici, bir derleyici özniteliği kullanarak başlatmayı devre dışı bırakabilir:

__attribute__((__uninitialized__)) char buf[BUFSIZ];

Uygulamalar aynı zamanda android:nativeHeapZeroInitialized manifest özelliğini kullanarak yığın sıfır başlatmayı da tercih edebilir. Alternatif olarak, yığın sıfır başlatma işlemi çalışma zamanında aşağıdakilerle kontrol edilebilir:

int mallopt(M_BIONIC_ZERO_INIT, level)

Seviyenin 0 veya 1 olduğu yer.

Sıfır başlatılan çekirdek belleği

CDD tarafından şiddetle tavsiye edilen GKI çekirdekleri için çekirdek yığını ve yığını sıfır olarak başlatıldı.

Yığın başlatma için GKI, CONFIG_INIT_STACK_ALL_ZERO yapılandırmasını kullanır; bu, çekirdeğin -ftrivial-auto-var-init=zero derleyici bayrağını kullanarak oluşturulmasıyla sonuçlanır. Yığın başlatma için GKI, tüm sayfa yığını, SLAB ve SLUB tahsislerini oluşturulduklarında sıfır-başlatılmış hale getiren CONFIG_INIT_ON_ALLOC_DEFAULT_ON kullanır. Bu seçenek, çekirdek önyükleme zamanı seçeneği olarak init_on_alloc=1 iletilmesine etkili bir şekilde benzer.

Hata raporları

Araçlarımız, hata ayıklamaya yardımcı olacak ek bilgiler içeren kapsamlı hata raporları oluşturur. Ek tahsis ve serbest bırakma yığın izlemesi, belirli bir tahsisin yaşam döngüsünün daha iyi anlaşılmasına yardımcı olur ve kök nedenli bellek güvenliği hatalarının çok daha hızlı oluşmasına yol açar.

Bellek güvenlik aracı tarafından oluşturulan hata raporu örneği
Şekil 1 : Bellek güvenlik araçları tarafından oluşturulan hata raporları

Geliştirme sırasında satıcılar, yerel çökmeler için /data/tombstones ve logcat kontrol ederek hataların varlığını izlemelidir. Android yerel kodunda hata ayıklama hakkında daha fazla bilgi için buradaki bilgilere bakın.