Sıfırla başlatılmış bellek

C ve C++'ta 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. Android, bu sorunların önüne geçmek için mümkün olduğunca fazla belleği başlatır.

Sıfırla başlatılmış kullanıcı alanı belleği

Android 12'den beri yığın belleği, tüm platform yerel kodlarında (JNI dahil) sıfırla başlatılır ve yığın belleği, tüm platform yerel işlemlerinde (netd gibi) sıfırla başlatılır ancak zygote'da veya uygulamalarda başlatılmaz.

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

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

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

int mallopt(M_BIONIC_ZERO_INIT, level)

Burada level 0 veya 1 değerini alır.

Sıfırla başlatılmış çekirdek belleği

GKI çekirdekleri için çekirdek yığını ve yığın sıfırlamasıyla başlatılır. Bu, CDD tarafından kesinlikle önerilir.

GKI, yığının ilk başlatılması için CONFIG_INIT_STACK_ALL_ZERO yapılandırma dosyasını kullanır. Bu, çekirdeğin -ftrivial-auto-var-init=zero derleyici işareti kullanılarak oluşturulmasına neden olur. GKI, yığın ilklendirmesi için CONFIG_INIT_ON_ALLOC_DEFAULT_ON değerini kullanır. Bu değer, tüm sayfa yığını, SLAB ve SLUB tahsislerinin oluşturulduğunda sıfırla başlatılmasını sağlar. Bu seçenek, init_on_alloc=1 değerini çekirdek önyükleme seçeneği olarak iletmeye benzer.

Hata raporları

Araçlarım, hata ayıklama işlemine yardımcı olacak ek bilgiler içeren ayrıntılı hata raporları oluşturur. Ek atama ve atama silme yığın izlemesi, belirli bir atamanın yaşam döngüsünü daha iyi anlamanıza yardımcı olur ve hafıza güvenliğiyle ilgili hataların temel nedenine çok daha hızlı ulaşmanızı sağlar.

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

Tedarikçi firmalar, geliştirme sırasında yerel kilitlenmeler için /data/tombstones ve logcat değerlerini kontrol ederek hataların varlığını izlemelidir. Android doğal kodunda hata ayıklama hakkında daha fazla bilgi için buraya bakın.