HWAddress Sanitizer

Android NDK mendukung HWAddress Sanitizer, juga dikenal sebagai HWASan, yang diperkenalkan mulai dari NDK r21 dan Android 10 (level API 29). HWASan hanya tersedia pada perangkat Arm 64-bit.

HWASan adalah alat deteksi error memori yang mirip dengan ASan. Dibandingkan dengan versi klasik ASan, HWASan memiliki:

  • Overhead CPU yang serupa (~2x)
  • Overhead ukuran kode yang serupa (40 – 50%)
  • Overhead RAM yang jauh lebih kecil (10% – 35%)

HWASan dapat mendeteksi rangkaian bug yang sama seperti ASan:

  • Stack dan luapan atau underflow buffer heap
  • Penggunaan heap setelah tersedia
  • Penggunaan stack di luar cakupan
  • Double free atau wild free

Selain itu, HWASan juga dapat mendeteksi:

  • Penggunaan stack setelah ditampilkan

Aplikasi Contoh

Aplikasi contoh menunjukkan cara mengonfigurasi varian build untuk hwasan.

Build

Untuk membangun kode native (JNI) aplikasi dengan HWAddress Sanitizer, lakukan hal berikut:

ndk-build

Dalam file Application.mk Anda:

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

Dalam file build.gradle modul Anda:

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

Untuk setiap target dalam CMakeLists.txt:

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

Dengan NDK 27 atau yang lebih baru, Anda juga dapat menggunakan hal berikut di build.gradle dan tidak perlu mengubah CMakeLists.txt:

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

Fitur ini tidak akan berfungsi saat menggunakan ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false.

Android 14 atau yang lebih baru: menambahkan wrap.sh

Jika menjalankan Android 14 atau yang lebih baru, Anda dapat menggunakan skrip wrap.sh untuk menjalankan aplikasi yang dapat di-debug di perangkat berbasis Android apa pun. Anda dapat melewati langkah ini jika memilih untuk mengikuti langkah-langkahnya di Petunjuk Penyiapan.

Ikuti petunjuk untuk mengemas skrip wrap.sh guna menambahkan skrip wrap.sh berikut untuk arm64-v8a.

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

Jalankan

Jika Anda menjalankan versi Android yang lebih lama dari 14, atau tidak menambahkan wrap.sh skrip, ikuti Petunjuk Penyiapan sebelum menjalankan aplikasi Anda.

Jalankan aplikasi seperti biasa. Saat error memori terdeteksi, aplikasi akan error dengan SIGABRT dan mencetak pesan mendetail ke logcat. Salinan pesan ini dapat ditemukan dalam file di /data/tombstones dan akan terlihat seperti ini:

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)

Pesan ini mungkin diikuti oleh informasi proses debug tambahan, termasuk daftar thread aktif dalam aplikasi, tag alokasi memori terdekat, dan nilai pendaftaran CPU.

Lihat Memahami laporan HWASan untuk informasi selengkapnya tentang pesan error HWASan.

Mem-build file command line yang dapat dieksekusi

Anda dapat membangun dan menjalankan file yang dapat dieksekusi yang diinstrumentasi dengan HWASan di Android 14 dan lebih baru. Anda dapat menggunakan konfigurasi yang sama seperti yang dijelaskan dalam Build untuk ndk-build atau CMake untuk file yang dapat dieksekusi. Mengirim file yang dapat dieksekusi ke perangkat menjalankan Android 14 atau yang lebih baru dan menjalankannya seperti biasa menggunakan shell.

Jika Anda menggunakan libc++, pastikan Anda menggunakan STL bersama dan dorong ke perangkat dan mengatur LD_LIBRARY_PATH ke direktori yang berisi perangkat tersebut saat menjalankan biner Anda.

Jika Anda tidak menggunakan Gradle, lihat dokumentasi NDK untuk mempelajari cara membangun dari command line dengan CMake dan ndk-build.

Android 13 atau yang lebih lama: Penyiapan

Jika perangkat menjalankan Android 14 atau yang lebih baru, Anda dapat melewati langkah ini dan mengikuti petunjuk untuk menggunakan wrap.sh di bagian Build di bawah. Anda juga dapat memilih untuk mengikuti bagian ini dan melewati petunjuk untuk menggunakan wrap.sh di bawah.

Sebelum Android 14, aplikasi HWASan memerlukan build HWASan Android agar dapat berjalan. Anda dapat mem-flash image HWASan bawaan ke perangkat Pixel yang didukung. Build tersebut tersedia pada ci.android.com, tempat Anda dapat mengklik kotak untuk build yang tepat yang diinginkan untuk mendapatkan link Flash Build. Ini mengharuskan Anda mengetahui namakode ponsel Anda.

Mem-flash build perangkat

Mungkin akan lebih mudah untuk langsung membuka flash.android.com karena di sana alurnya dimulai dengan mendeteksi perangkat Anda dan hanya menampilkan build yang dapat digunakan. Gambar berikut mengilustrasikan alur penyiapan dalam alat ini.

Aktifkan mode developer di perangkat dan hubungkan ke komputer menggunakan kabel USB. Klik Add new device, pilih perangkat dari dialog, lalu klik Connect.

Mendeteksi perangkat untuk di-flash Memilih perangkat yang akan dihubungkan

Setelah perangkat terhubung, klik untuk mengonfigurasi build. Di kotak Select a build ID, pilih cabang aosp-master-with-phones-throttled untuk otomatis memilih image yang benar pada perangkat yang telah dihubungkan.

Pilih perangkat yang akan di-flash Konfirmasikan opsi flash lalu flash perangkat

Klik Instal untuk melakukan flash perangkat.

Detail selengkapnya tentang penyiapan yang diperlukan tersedia dalam Dokumentasi Android Flash Tool. Atau, Anda juga dapat memeriksa Dokumentasi AOSP untuk mendapatkan petunjuk tentang membuat image HWASan dari sumber.