HWAddress-Sanitizer

Das Android-NDK unterstützt HWAddress Sanitizer, auch bekannt als HWASan, von Anfang an mit NDK r21 und Android 10 (API-Level 29). HWASan ist nur mit einer 64-Bit-Version verfügbar. ARM-Geräte.

HWASan ist ein Tool zur Erkennung von Arbeitsspeicherfehlern, das ASan ähnelt. Im Vergleich zu Creator Studio Classic ASan, HWASan hat:

  • Ähnlicher CPU-Overhead (~2x)
  • Aufwand mit ähnlicher Codegröße (40–50%)
  • Viel geringerer RAM-Overhead (10–35 %)

HWASan erkennt die gleichen Fehler wie ASan:

  • Über- oder Unterlauf von Stack- und Heap-Zwischenspeichern
  • Heap-Nutzung nach kostenloser Nutzung
  • Stack-Verwendung außerhalb des Zuständigkeitsbereichs
  • Double Free oder Wild Free

Darüber hinaus erkennt HWASan außerdem:

  • Verwendung des Stapels nach Rückgabe

Beispiel-App

Beispiel-App zeigt die Konfiguration einer Build-Variante für Hawasan.

Eine Community

Um den nativen Code (JNI) Ihrer App mit HWAddress Sanitizer zu erstellen, führen Sie die Folgendes:

Ndk-Build

In der Datei 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

In der Datei build.gradle deines Moduls:

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

Führen Sie für jedes Ziel in der Datei CMakeLists.txt folgende Schritte aus:

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

Mit NDK 27 oder höher kannst du auch Folgendes in deinem build.gradle verwenden und müssen die Datei CMakeLists.txt nicht ändern:

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

Dies funktioniert nicht bei Verwendung von ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false.

Android 14 oder höher: wrap.sh hinzufügen

Wenn Sie Android 14 oder höher verwenden, können Sie ein wrap.sh-Skript zum Ausführen Ihrer Debug-fähigen App auf beliebigen Android-Gerät Sie können diesen Schritt überspringen, wenn Sie sich dafür entschieden haben, die Schritte auszuführen. in der Einrichtungsanleitung.

Folgen Sie der Anleitung, um verpacken Sie ein wrap.sh-Skript, um den folgendes wrap.sh-Skript für arm64-v8a.

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

Laufen

Wenn Sie eine Android-Version verwenden, die älter als 14 ist, oder wenn Sie kein wrap.sh folgen Sie der Einrichtungsanleitung, bevor Sie die App ausführen.

Führen Sie die App wie gewohnt aus. Bei einem Speicherfehler stürzt eine App ab mit SIGABRT und gibt eine detaillierte Nachricht an logcat aus. Eine Kopie der Nachricht kann in einer Datei unter /data/tombstones gefunden werden und so aussieht:

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)

Auf die Meldung können zusätzliche Debugging-Informationen folgen, einschließlich der eine Liste der Live-Threads in der Anwendung, Tags von Arbeitsspeicherzuweisungen in der Nähe und CPU-Registerwerte.

Weitere Informationen zum HWASan-Fehler finden Sie unter Informationen zu HWASan-Berichten. Nachrichten.

Ausführbare Befehlszeilen erstellen

Sie können ausführbare Dateien, die mit HWASan instrumentiert sind, unter Android 14 und neuer. Sie können dieselbe Konfiguration verwenden, die in Build für ndk-build oder CMake für Ihre ausführbaren Dateien. Ausführbare Dateien per Push an ein Gerät senden auf denen Android 14 oder höher ausgeführt wird, und es wie gewohnt mit der Shell ausführen.

Wenn Sie libc++ verwenden, achten Sie darauf, dass Sie die freigegebene STL-Datei verwenden, und übertragen Sie sie auf und legen Sie für LD_LIBRARY_PATH das Verzeichnis fest, in dem es sich befindet, das Ausführen Ihrer Binärdatei.

Wenn Sie Gradle nicht verwenden, finden Sie in der NDK-Dokumentation in die Befehlszeile mit CMake und ndk-build.

Android 13 oder niedriger: Einrichtung

Wenn auf Ihrem Gerät Android 14 oder höher installiert ist, können Sie diesen Schritt überspringen und der Anleitung zur Verwendung von wrap.sh im Abschnitt Build unten. Sie können auch diesem Abschnitt folgen und die Anleitung zur Verwendung wrap.sh unten.

Vor Android 14 ist für HWASan-Anwendungen ein HWASan-Build von Android erforderlich. Sie können vordefinierte HWASan-Images auf unterstützte Pixel-Geräte flashen. Die Builds sind auf ci.android.com. Klicken Sie dort auf das Quadrat Sie erhalten einen Link zu einem Flash-Build. Dazu müssen Sie wissen, den Codenamen Ihres Smartphones.

Geräte-Build flashen

Es kann einfacher sein, direkt zu flash.android.com zu gehen, da sich das Symbol beginnt der Ablauf mit der Geräteerkennung und zeigt nur Builds an, die du nutzen kannst. Die folgenden Bilder veranschaulichen die Einrichtung dieses Tools.

Aktivieren Sie den Entwicklermodus auf Ihrem Gerät und verbinden Sie es über ein USB-Kabel an. Klicken Sie auf Neues Gerät hinzufügen, wählen Sie im Dialogfeld Ihr Gerät aus und Klicken Sie auf Verbinden.

Ein zu blinkendes Gerät erkennen Gerät auswählen, mit dem eine Verbindung hergestellt werden soll

Wenn das Gerät verbunden ist, klicken Sie darauf, um den Build zu konfigurieren. Wählen Sie im Feld Build-ID auswählen die Option aosp-master-with-phones-throttled aus. um automatisch das richtige Image für Ihr Gerät auszuwählen. verbunden.

Zu blinkendes Gerät auswählen Blitzoptionen bestätigen und Gerät flashen

Klicke auf Installieren, um dein Gerät zu flashen.

Weitere Informationen zur erforderlichen Konfiguration finden Sie in der Dokumentation zum Android Flash Tool Alternativ können Sie die In der AOSP-Dokumentation finden Sie eine Anleitung zum Erstellen eines HWASan-Image aus der Quelle.