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.
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.