Igienizzante per indirizzi HW

L'NDK di Android supporta HWAddress Sanitizer, noto anche come HWASan, a partire da NDK r21 e Android 10 (livello API 29). HWASan è disponibile solo sui dispositivi Arm a 64 bit.

HWASan è uno strumento per il rilevamento degli errori di memoria simile ad ASan. Rispetto al classico ASan, HWASan ha:

  • Overhead della CPU simile (~2 volte)
  • Overhead per dimensioni di codici simili (40-50%)
  • Overhead della RAM molto più ridotto (10% - 35%)

HWASan rileva lo stesso insieme di bug di ASan:

  • overflow o underflow del buffer dello stack e dell'heap
  • Utilizzo heap dopo libero
  • Utilizzo dello stack al di fuori dell'ambito
  • Doppio o selvaggio

Inoltre, HWASan rileva anche:

  • Utilizzo dello stack dopo il reso

App di esempio

Un'app di esempio mostra come configurare una variante della build per hwasan.

Crea

Per creare il codice nativo (JNI) della tua app con HWAddress Sanitizer:

build ndk

Nel tuo file Application.mk:

APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress

CMake

Nel file build.gradle del tuo modulo:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL, but not c++_static.
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
}

Per ogni target nel file CMakeLists.txt:

target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)

Android 14 o versioni successive: aggiungi wrap.sh

Se utilizzi Android 14 o versioni successive, puoi utilizzare uno script wrap.sh per eseguire l'app debuggable su qualsiasi dispositivo Android. Puoi saltare questo passaggio se hai scelto di seguire la procedura descritta in Istruzioni di configurazione.

Segui le istruzioni per creare uno script wrap.sh per aggiungere il seguente script wrap.sh per arm64-v8a.

#!/system/bin/sh
LD_HWASAN=1 exec "$@"

Corsa

Se utilizzi una versione di Android precedente alla 14 o non hai aggiunto uno script wrap.sh, segui le istruzioni di configurazione prima di eseguire l'app.

Esegui l'app come fai di solito. Quando viene rilevato un errore di memoria, un'app ha un arresto anomalo con SIGABRT e stampa un messaggio dettagliato per logcat. Una copia del messaggio si trova in un file in /data/tombstones e ha il seguente aspetto:

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

Il messaggio può essere seguito da ulteriori informazioni di debug, tra cui l'elenco dei thread attivi nell'applicazione, i tag delle allocazioni della memoria nelle vicinanze e i valori del registro della CPU.

Per saperne di più sui messaggi di errore HWASan, consulta Informazioni sui report HWASan.

Creazione degli eseguibili della riga di comando

Puoi creare ed eseguire gli eseguibili instrumentati con HWASan su Android 14 e versioni successive. Puoi utilizzare la stessa configurazione descritta in Build per ndk-build o CMake per i tuoi eseguibili. Esegui il push degli eseguibili su un dispositivo con Android 14 o versioni successive ed eseguili normalmente utilizzando la shell.

Se utilizzi libc++, assicurati di utilizzare lo STL condiviso ed eseguine il push al dispositivo e imposta LD_LIBRARY_PATH sulla directory che lo contiene quando esegui il programma binario.

Se non utilizzi Gradle, consulta la documentazione di NDK per scoprire come creare dalla riga di comando con CMake e ndk-build.

Android 13 o versioni precedenti: configurazione

Se sul tuo dispositivo è installato Android 14 o versioni successive, puoi saltare questo passaggio e seguire le istruzioni per l'utilizzo di wrap.sh nella sezione Build di seguito. Puoi anche scegliere di seguire questa sezione e saltare le istruzioni riportate di seguito per l'utilizzo di wrap.sh.

Prima di Android 14, per essere eseguite le applicazioni HWASan necessitano di una build HWASan di Android. Puoi eseguire il flashing di immagini HWASan predefinite sui dispositivi Pixel supportati. Le build sono disponibili sul sito ci.android.com, dove puoi fare clic sul quadrato relativo alla build esatta per cui vuoi ottenere un link a Build Flash. Devi conoscere il nome in codice del tuo telefono.

Flash della build di un dispositivo

Potrebbe essere più semplice accedere direttamente a Flash.android.com perché il flusso inizia con il rilevamento del dispositivo e mostra solo le build che puoi utilizzare. Le seguenti immagini illustrano il flusso di configurazione in questo strumento.

Attiva la modalità sviluppatore sul dispositivo e collegala al computer utilizzando un cavo USB. Fai clic su Aggiungi nuovo dispositivo, seleziona il tuo dispositivo dalla finestra di dialogo e fai clic su Connetti.

Rileva il flash di un dispositivo Seleziona il dispositivo a cui connetterti

Dopo aver connesso il dispositivo, fai clic sul dispositivo per configurare la build. Nella casella Seleziona un ID build, seleziona il ramo aosp-master-with-phones-throttled per scegliere automaticamente l'immagine corretta per il dispositivo che hai collegato.

Seleziona il dispositivo da lampeggiare Conferma le opzioni del flash e fai lampeggiare il dispositivo

Fai clic su Installa per eseguire il flashing del dispositivo.

Ulteriori dettagli sulla configurazione necessaria sono disponibili nella documentazione di Android Flash Tool. In alternativa, puoi consultare la documentazione AOSP per istruzioni su come creare un'immagine HWASan dall'origine.