Program sanitarny HWAddress

NDK Androida obsługuje narzędzie HWAddress Sanitizer (znane też jako HWASan). Początek z NDK r21 i Androidem 10 (poziom API 29). HWASan jest dostępny tylko w wersjach 64-bitowych Włącz alarm urządzeń.

HWASan to narzędzie do wykrywania błędów pamięci podobne do ASan. W porównaniu do klasyki ASan i HWASan:

  • Podobny narzut procesora (ok. 2x)
  • Narzut związany z podobnym rozmiarem kodu (40–50%)
  • Znacznie mniejszy narzut pamięci RAM (10% –35%)

HWASan wykrywa ten sam zestaw błędów co ASan:

  • Przepełnienie lub niedopełnienie bufora stosu i sterty
  • Wykorzystanie sterty po bezpłatnym
  • Użycie stosu poza zakresem
  • Podwójne wolne lub dzikie

Dodatkowo HWASan wykrywa również:

  • Wykorzystanie stosu po zwrocie

Przykładowa aplikacja

Przykładowa aplikacja pokazuje, jak skonfigurować wariant kompilacji dla Hwasan.

Budowanie

Aby utworzyć natywny kod aplikacji (JNI) za pomocą narzędzia HWAddress Sanitizer, wykonaj :

ndk-build

W pliku 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

W pliku build.gradle modułu:

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

W przypadku każdego elementu docelowego w pliku CMakeLists.txt:

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

Jeśli masz subskrypcję NDK 27 lub nowszą, w build.gradle możesz też używać tych elementów i nie musisz zmieniać pliku CMakeLists.txt:

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

Ta funkcja nie będzie działać podczas korzystania z: ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false.

Android 14 lub nowszy: dodaj plik wrap.sh

Jeśli masz Androida 14 lub nowszego, możesz użyć skryptu wrap.sh, aby uruchomić aplikację debuggable w dowolnym miejscu Urządzenie z systemem Android. Możesz pominąć ten krok, jeśli zdecydujesz się wykonać podane niżej czynności w instrukcjach konfiguracji.

Postępuj zgodnie z instrukcjami, aby: spakuj skrypt wrap.sh, aby dodać do ten skrypt wrap.sh dla domeny arm64-v8a.

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

Uruchom

Jeśli używasz Androida w wersji starszej niż 14 lub nie masz dodanego pliku wrap.sh skryptu, wykonaj instrukcje konfiguracji, zanim uruchomisz aplikację.

Uruchom aplikację tak jak zwykle. W przypadku wykrycia błędu pamięci aplikacja ulega awarii, SIGABRT i drukuje szczegółowy komunikat dla logcat. Kopia wiadomości może znajduje się w pliku pod adresem /data/tombstones i wygląda tak:

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)

Po komunikacie mogą pojawiać się dodatkowe informacje na potrzeby debugowania, w tym lista aktywnych wątków w aplikacji, tagi pobliskich alokacji pamięci oraz Wartości rejestru procesora.

Więcej informacji o błędach HWASan znajdziesz w artykule Omówienie raportów HWASan. wiadomości.

Tworzenie plików wykonywalnych wiersza poleceń

Na Androidzie 14 i Androidzie 14 można tworzyć i uruchamiać pliki wykonywalne z wykorzystaniem HWASan nowszą. Możesz użyć tej samej konfiguracji opisanej w sekcji Tworzenie dla ndk-build lub CMake dla plików wykonywalnych. Przekazywanie plików wykonywalnych na urządzenie z Androidem 14 lub nowszym i uruchamiaj go normalnie, używając powłoki.

Jeśli używasz libc++, upewnij się, że używasz udostępnionego STL, i przekaż go do na urządzeniu i ustaw LD_LIBRARY_PATH na katalog, który je zawiera, uruchomienia pliku binarnego.

Jeśli nie używasz Gradle, zapoznaj się z dokumentacją NDK, aby dowiedzieć się, jak tworzyć na podstawie wiersza poleceń CMake ndk-build.

Android 13 lub starszy: konfiguracja

Jeśli masz urządzenie z Androidem 14 lub nowszym, możesz pominąć ten krok i wykonać instrukcje korzystania z pliku wrap.sh w sekcji Kompilacja poniżej. Możesz też skorzystać z tej sekcji i pominąć instrukcje wrap.sh poniżej.

W wersjach starszych niż Android 14 aplikacje HWASan do uruchamiania wymagają kompilacji HWASan na Androida. Na obsługiwanych urządzeniach Pixel możesz flashować gotowe obrazy HWASan. Te konstrukcje są dostępny na ci.android.com, gdzie możesz kliknąć kwadrat oznaczający dokładną kompilację, którą chcesz uzyskać link do kompilacji Flash. W tym celu musisz znać kryptonim swojego telefonu.

Flash kompilacja urządzenia

Może być prościej przejść bezpośrednio na stronę flash.android.com, ponieważ tam jest proces rozpoczyna się od wykrycia urządzenia i pojawi się tylko te kompilacje, których możesz użyć. Poniższe obrazy ilustrują proces konfiguracji tego narzędzia.

Włącz na urządzeniu tryb programisty i połącz je z komputerem za pomocą kabla USB. Kliknij Dodaj nowe urządzenie, wybierz swoje urządzenie w oknie. kliknij Połącz.

Wykrywanie urządzenia do lampy błyskowej Wybierz urządzenie, z którym chcesz się połączyć

Po połączeniu urządzenia kliknij je, aby skonfigurować kompilację. W polu Wybierz identyfikator kompilacji kliknij aosp-master-with-phones-throttled gałąź, aby automatycznie wybrać właściwy obraz dla posiadanego urządzenia. – podłączono

Wybierz urządzenie do flashowania Potwierdź opcje lampy błyskowej i załaduj urządzenie

Kliknij Zainstaluj, by zainstalować aktualizację.

Więcej informacji o niezbędnej konfiguracji znajdziesz w Dokumentacja Android Flash Tool Możesz też sprawdzić Dokumentacja AOSP zawiera instrukcje tworzenia obrazu HWASan ze źródła.