Igienizzante per indirizzi HW

Android NDK supporta il sanitizer HWAddress, noto anche come HWASan, che inizia con NDK r21 e Android 10 (livello API 29). HWASan è disponibile solo sul formato a 64 bit Abilita i dispositivi.

HWASan è uno strumento di rilevamento degli errori di memoria simile ad ASan. Rispetto alla versione classica ASan, HWASan ha:

  • Overhead CPU simile (~2x)
  • Overhead per dimensioni codice simili (40-50%)
  • Overhead della RAM molto minore (10%-35%)

HWASan rileva lo stesso insieme di bug di ASan:

  • overflow o underflow del buffer di stack e heap
  • Utilizzo dell'heap dopo la prova senza costi
  • Utilizzo dello stack al di fuori dell'ambito
  • double free o wild free

Inoltre, HWASan rileva anche:

  • Utilizzo dello stack dopo il reso

App di esempio

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

Crea

Per creare il codice nativo della tua app (JNI) con HWAddress Sanitizer, procedi nel seguente modo: seguenti:

build-ndk

Nel 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

Marca

Nel file build.gradle del 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)

Con NDK 27 o versioni successive, puoi anche utilizzare quanto segue nel tuo build.gradle e non devi modificare CMakeLists.txt:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_SANITIZE=hwaddress"
            }
        }
    }
}

Questa operazione non funzionerà se utilizzi ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false.

Android 14 o versioni successive: aggiungi wrap.sh

Se usi Android 14 o versioni successive, puoi utilizzare un wrap.sh script per eseguire l'app debuggable su qualsiasi Dispositivo con tecnologia Android. Se hai scelto di seguire questa procedura, puoi saltare questo passaggio. nelle Istruzioni sulla configurazione.

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

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

Esegui

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

Esegui l'app come di consueto. Quando viene rilevato un errore di memoria, un'app ha un arresto anomalo con SIGABRT e stampa un messaggio dettagliato in logcat. Una copia del messaggio può presente 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 di thread attivi nell'applicazione, i tag delle allocazioni di memoria nelle vicinanze Valori del registro CPU.

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

Creazione di eseguibili dalla riga di comando

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

Se utilizzi libc++, assicurati di usare l'STL condiviso ed eseguine il push su il dispositivo e imposta LD_LIBRARY_PATH sulla directory che lo contiene che esegue il file binario.

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

Android 13 o versioni precedenti: configurazione

Se il tuo dispositivo esegue 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 per l'utilizzo wrap.sh sotto.

Prima di Android 14, per l'esecuzione delle applicazioni HWASan era necessaria una build Android HWASan. Puoi eseguire il flashing di immagini HWASan predefinite sui dispositivi Pixel supportati. Le build sono disponibile su ci.android.com, dove puoi fare clic sul quadrato per alla build esatta per cui vuoi ottenere un link Build Flash. Devi conoscere il nome in codice del tuo telefono.

Esegui il flashing della build di un dispositivo

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

Attiva la modalità sviluppatore sul dispositivo e collegalo 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 un dispositivo per il flash Seleziona il dispositivo a cui connetterti

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

Seleziona il dispositivo per il flash Conferma le opzioni di flash ed esegui il flashing del dispositivo

Fai clic su Installa per eseguire il flashing del dispositivo.

Puoi trovare maggiori dettagli sulla configurazione necessaria nel Documentazione di Android Flash Tool. In alternativa, puoi controllare Documentazione AOSP per istruzioni su come creare un'immagine HWASan dal codice sorgente.