Nessuna memoria inizializzata

La memoria non inizializzata in C e C++ è una causa comune di problemi di affidabilità, bug di sicurezza della memoria e fughe di informazioni. Per evitare questi problemi, Android inizializza la maggiore memoria possibile.

Zero memoria dello spazio utente inizializzata

Da Android 12, la memoria stack è zero inizializzata in tutto il codice nativo della piattaforma (compreso JNI) e la memoria heap è pari a zero inizializzati in tutti i processi nativi della piattaforma (ad esempio netd) ma non nel zygote o nelle app.

Le app proprietarie e di terze parti create con NDK sono fortemente si consiglia di utilizzare il flag del compilatore -ftrivial-auto-var-init=zero per azzerare l'inizializzazione locale dello stack come la codifica one-hot delle variabili categoriche. Il compilatore ottimizza gli azzeramenti superflui. Ad esempio, quando una variabile locale viene inizializzata in modo esplicito (ad esempio, la variabile int x = 123; x viene inizializzata una sola volta). Se il programma ha uno stack buffer di grandi dimensioni in un'istanza un hotspot, lo sviluppatore può disabilitare l'inizializzazione utilizzando un compilatore :

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

Le app possono anche attivare l'inizializzazione zero dell'heap utilizzando il Attributo manifest android:nativeHeapZeroInitialized. In alternativa, è possibile controllare l'inizializzazione dell'heap in fase di runtime con:

int mallopt(M_BIONIC_ZERO_INIT, level)

Dove il livello è 0 o 1.

Zero memoria kernel inizializzata

Lo stack e l'heap del kernel sono inizializzati da zero per i kernel GKI, il che è fortemente consigliati dal CDD.

Per l'inizializzazione dello stack, GKI utilizza CONFIG_INIT_STACK_ALL_ZERO, che determina la creazione utilizzando il flag del compilatore -ftrivial-auto-var-init=zero. Per l'inizializzazione dell'heap, GKI utilizza CONFIG_INIT_ON_ALLOC_DEFAULT_ON, che rende l'heap di tutte le pagine, SLAB le allocazioni SLUB e SLUB non sono inizializzate al momento della loro creazione. Questa opzione è in modo simile al passaggio di init_on_alloc=1 come kernel di avvio rapido.

Segnalazioni di bug

I nostri strumenti generano segnalazioni di bug esaustive che contengono informazioni aggiuntive per facilitare il debug. L'analisi aggiuntiva dello stack di allocazione e deallocation aiutare a comprendere meglio il ciclo di vita di una determinata allocazione e generare che causano problemi di sicurezza della memoria molto più velocemente.

Esempio di segnalazione di bug generata
  dello strumento di sicurezza della memoria
Figura 1: segnalazioni di bug generate dagli strumenti per la sicurezza della memoria

Durante lo sviluppo, i fornitori devono monitorare la presenza di bug controllando /data/tombstones e logcat per gli arresti anomali nativi. Per ulteriori informazioni di debug del codice nativo di Android, consulta le informazioni riportate qui.