HWAddress-Sanitizer

Das Android-NDK unterstützt HWAddress Sanitizer, auch HWASan genannt, beginnend mit NDK r21 und Android 10 (API-Level 29). HWASan ist nur auf 64-Bit-Arm-Geräten verfügbar.

HWASan ist ein Tool zur Erkennung von Speicherfehlern, ähnlich wie ASan. Im Vergleich zum klassischen ASan bietet HWASan:

  • Ähnlicher CPU-Aufwand (~2x)
  • Overhead bei ä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-Puffern
  • Heap-Nutzung nach der kostenlosen Nutzung
  • Stacknutzung außerhalb des Bereichs
  • Double Free oder Wild Free

Darüber hinaus erkennt HWASan Folgendes:

  • Stapelverwendung nach Rückgabe

Beispiel-App

Eine Beispiel-App zeigt, wie eine Build-Variante für Hwasan konfiguriert wird.

Eine Community

So erstellen Sie den JNI-Code (nativen Code) Ihrer Anwendung mit HWAddress Sanitizer:

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 Ihrer CMakeLists.txt-Datei folgende Schritte aus:

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

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

Wenn Sie Android 14 oder höher ausführen, können Sie ein wrap.sh-Skript verwenden, um die debuggable App auf einem beliebigen Android-Gerät auszuführen. Sie können diesen Schritt überspringen, wenn Sie der Einrichtungsanleitung folgen.

Folgen Sie der Anleitung zum Paket eines wrap.sh-Skripts, um das folgende wrap.sh-Skript für arm64-v8a hinzuzufügen.

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

Laufen

Wenn Sie eine Android-Version vor 14 verwenden oder kein wrap.sh-Skript hinzugefügt haben, folgen Sie der Einrichtungsanleitung, bevor Sie Ihre App ausführen.

Führen Sie die App wie gewohnt aus. Wenn ein Speicherfehler erkannt wird, stürzt eine Anwendung mit SIGABRT ab und gibt eine detaillierte Meldung an Logcat aus. Eine Kopie der Nachricht befindet sich in einer Datei unter /data/tombstones und sieht so aus:

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 Nachricht können zusätzliche Debugging-Informationen folgen, einschließlich der Liste der Live-Threads in der Anwendung, Tags für nahe gelegene Arbeitsspeicherzuweisungen und CPU-Registrierwerte.

Weitere Informationen zu HWASan-Fehlermeldungen finden Sie unter Informationen zu HWASan-Berichten.

Ausführbare Befehlszeilendateien erstellen

Sie können ausführbare Dateien, die mit HWASan instrumentiert sind, unter Android 14 und höher erstellen und ausführen. Sie können für Ihre ausführbaren Dateien die unter Build beschriebene Konfiguration für ndk-build oder CMake verwenden. Übertragen Sie die ausführbaren Dateien auf ein Gerät mit Android 14 oder höher und führen Sie sie wie gewohnt mit der Shell aus.

Wenn Sie libc++ verwenden, achten Sie darauf, dass Sie das freigegebene STL verwenden, übertragen Sie es per Push auf das Gerät und setzen Sie LD_LIBRARY_PATH auf das Verzeichnis, in dem es sich befindet, wenn Sie Ihre Binärdatei ausführen.

Wenn Sie Gradle nicht verwenden, finden Sie in der NDK-Dokumentation Informationen dazu, wie Sie mit CMake und ndk-build Builds über die Befehlszeile erstellen.

Android 13 oder niedriger: Einrichtung

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

Vor Android 14 benötigen HWASan-Anwendungen einen HWASan-Build von Android, um ausgeführt werden zu können. Sie können vordefinierte HWASan-Images auf unterstützten Pixel-Geräten flashen. Die Builds sind unter ci.android.com verfügbar. Klicken Sie auf das Quadrat für den genauen Build, für den Sie einen Flash-Build erhalten möchten. Dazu müssen Sie den Codenamen für Ihr Smartphone kennen.

Flash eines Geräte-Builds

Unter Umständen ist es einfacher, stattdessen direkt flash.android.com aufzurufen, da der Ablauf mit der Erkennung Ihres Geräts beginnt und nur die Builds angezeigt werden, die Sie verwenden können. Die folgenden Bilder veranschaulichen den Einrichtungsablauf in diesem Tool.

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

Gerät für Blitz erkennen Gerät auswählen, mit dem eine Verbindung hergestellt werden soll

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

Zu blinkendes Gerät auswählen Blitzoptionen bestätigen und Gerät blinken lassen

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

Weitere Informationen zur erforderlichen Einrichtung findest du in der Dokumentation zum Android-Flash-Tool. Alternativ können Sie in der AOSP-Dokumentation nachlesen, wie Sie ein HWASan-Image aus der Quelle erstellen.