HWAddress Sanitizer

Android NDK mendukung HWAddress Sanitizer dimulai dari NDK r21 dan Android 10 (API level 29).

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/underflow buffer heap
  • Penggunaan heap setelah tersedia
  • Penggunaan stack di luar cakupan
  • Double free/wild free

Selain itu, HWASan juga dapat mendeteksi:

  • Penggunaan stack setelah ditampilkan

Penyiapan

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 build yang tepat (persegi) 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 alurnya dimulai dengan mendeteksi perangkat Anda dan hanya menampilkan build yang dapat Anda gunakan. Gambar berikut mengilustrasikan alur penyiapan dalam alat ini.

Aktifkan mode developer di perangkat dan hubungkan ke komputer menggunakan kabel USB. Klik Tambahkan perangkat baru, pilih perangkat dari dialog, lalu klik Hubungkan.

Mendeteksi perangkat untuk di-flash Pilih perangkat yang akan dihubungkan

Setelah perangkat terhubung, Anda perlu mengkliknya untuk mengonfigurasi build. Di kotak Pilih ID build, pilih cabang aosp-master-with-phones-throttled untuk otomatis memilih image yang benar pada perangkat yang telah Anda hubungkan.

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

Klik Instal untuk mem-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.

Build

Untuk membuat 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)
set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -fsanitize=hwaddress)

Run

Jalankan aplikasi seperti biasa pada image Android yang dibuat melalui HWASan. Saat error memori terdeteksi, aplikasi akan mengalami error dengan SIGABRT dan menampilkan pesan mendetail ke logcat. Salinan pesan ini dapat ditemukan dalam file yang ada 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, seperti daftar thread aktif dalam aplikasi, tag alokasi memori terdekat, nilai pendaftaran CPU, dan sebagainya.