Lihat Memahami HWASan laporan untuk mengetahui informasi tentang cara membaca error HWASan.
AddressSanitizer yang dibantu hardware (HWASan) adalah error memori alat deteksi yang mirip dengan AddressSanitizer. HWASan menggunakan RAM jauh lebih sedikit dibandingkan ASan, sehingga cocok untuk seluruh sanitasi sistem. HWASan hanya tersedia di Android 10 dan yang lebih tinggi, dan hanya pada perangkat keras AArch64.
Meskipun terutama berguna untuk kode C/C++, HWASan juga dapat membantu men-debug kode Java yang menyebabkan error di C/C++ yang digunakan untuk mengimplementasikan antarmuka Java. Hal ini membantu karena menangkap memori {i>error<i} ketika terjadi, mengarahkan Anda langsung ke kode yang bertanggung jawab.
Anda dapat mem-flash image HWASan bawaan ke perangkat Pixel yang didukung dari ci.android.com (petunjuk penyiapan mendetail).
Dibandingkan dengan ASan klasik, 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 dapat mendeteksi penggunaan stack setelah ditampilkan.
HWASan (sama seperti ASan) kompatibel dengan UBSan, keduanya dapat diaktifkan pada target secara bersamaan.
Detail dan batasan penerapan
HWASan didasarkan pada memori pemberian tag, dengan nilai tag acak yang dikaitkan baik dengan {i>pointer<i} maupun dengan rentang alamat memori. Untuk kenangan akses valid, tag pointer dan memori harus cocok. HWASan bergantung pada fitur ARMv8 top byteignore (TBI), juga disebut pemberian tag alamat virtual, untuk menyimpan tag pointer di dengan bit alamat tertinggi.
Anda dapat membaca lebih lanjut tentang desain HWASan di situs dokumentasi Clang.
Secara desain, HWASan tidak memiliki zona merah berukuran terbatas ASan untuk mendeteksi overflow atau karantina kapasitas terbatas ASan untuk mendeteksi penggunaan setelah tersedia. Karena alasan ini, HWASan dapat mendeteksi {i>bug<i} tidak peduli seberapa besar overflow atau berapa lama memori dibatalkan alokasinya. Hal ini memberi HWASan keuntungan besar dibandingkan ASan.
Namun, HWASan memiliki kemungkinan nilai tag yang terbatas (256), yang berarti bahwa ada kemungkinan 0,4% untuk melewatkan {i>bug<i} selama satu kali pelaksanaan program.
Persyaratan
Versi terbaru (4.14+) Dukungan kernel Android umum HWASan yang siap pakai. Cabang khusus Android 10 tidak memiliki dukungan untuk HWASan.
Dukungan userspace untuk HWASan tersedia mulai dari Android 11.
Jika Anda bekerja dengan {i>kernel<i} yang berbeda, HWASan membutuhkan {i>kernel<i} Linux untuk menerima pointer yang diberi tag di argumen panggilan sistem. Dukungan untuk hal ini diterapkan di patchset upstream berikut:
- ABI alamat yang diberi tag ARM64
- arm64: menghapus tag pada pointer pengguna yang diteruskan ke kernel
- mm: Menghindari membuat alias alamat virtual di brk()/mmap()/mremap()
- arm64: Memvalidasi alamat yang diberi tag di access_ok() yang dipanggil dari thread kernel
Jika Anda membangun dengan toolchain kustom, pastikan toolchain tersebut menyertakan semuanya hingga commit LLVM c336557f.
Menggunakan HWASan
Gunakan perintah berikut untuk membangun seluruh platform menggunakan HWASan:
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
Untuk memudahkan, Anda dapat menambahkan setelan SANITIZE_TARGET ke definisi produk, mirip dengan AOSP_coral_hwasan.
Bagi pengguna yang terbiasa dengan AddressSanitizer, banyak kompleksitas build yang hilang:
- Tidak perlu menjalankan make dua kali.
- Build inkremental dapat langsung difungsikan.
- Tidak perlu mem-flash data pengguna.
Beberapa pembatasan AddressSanitizer juga tidak ada:
- File yang dapat dieksekusi statis didukung.
- Anda dapat melewati sanitasi target apa pun selain libc. Tidak seperti ASan, tidak ada persyaratan bahwa jika {i>library<i} disanitasi, maka setiap {i>executable<i} yang menautkannya juga harus.
Beralih antara HWASan dan image biasa dengan nomor build yang sama (atau lebih tinggi) dapat dilakukan dengan bebas. Tidak perlu menghapus perangkat.
Untuk melewati sanitasi modul, gunakan
LOCAL_NOSANITIZE := hwaddress
(Android.mk) atau
sanitize: { hwaddress: false }
(Android.bp).
Membersihkan target individu
HWASan dapat diaktifkan per target dalam build reguler (tidak bersih), selama libc.so
juga
dibersihkan. Tambahkan hwaddress: true
ke blok sanitasi di "libc_defaults"
dalam bionic/libc/Android.bp. Kemudian lakukan hal yang sama pada target yang sedang Anda kerjakan.
Perhatikan bahwa membersihkan libc memungkinkan pemberian tag alokasi memori heap di seluruh sistem, serta
pemeriksaan tag untuk operasi memori di dalam libc.so
. Fungsi ini dapat menangkap {i>bug<i}
bahkan dalam biner
bahwa HWASan tidak diaktifkan jika akses memori buruk berada di libc.so
(misalnya, pthread_mutex_unlock()
pada mutex delete()
ed).
Anda tidak perlu mengubah file build apa pun jika seluruh platform di-build menggunakan HWASan.
Stasiun Flash
Untuk tujuan pengembangan, Anda dapat mem-flash build AOSP berkemampuan HWASan ke perangkat Pixel dengan bootloader yang tidak terkunci menggunakan Flashstation. Pilih target _hwasan, mis. {i>Apo_flame_hwasan-userdebug<i}. Lihat Dokumentasi NDK untuk HWASan bagi pengembang aplikasi untuk detail lebih lanjut.
Stack trace yang lebih baik
HWASan menggunakan unwinder berbasis frame pointer yang cepat untuk merekam stack
untuk setiap peristiwa alokasi dan dealokasi memori di
program ini. Android mengaktifkan pointer frame dalam kode AArch64 secara default,
jadi ini bekerja
dengan baik dalam praktiknya. Jika Anda perlu bersantai
kode terkelola, tetapkan HWASAN_OPTIONS=fast_unwind_on_malloc=0
di lingkungan proses. Perhatikan bahwa stack akses memori yang buruk
pelacakan menggunakan "lambat" {i>unwinder<i} secara {i>default<i}; setelan ini hanya memengaruhi
alokasi dan dealokasi. Opsi ini bisa sangat
menggunakan CPU secara intensif, tergantung pada bebannya.
Simbolisasi
Lihat Simbolisasi dalam "Memahami laporan HWASan".
HWASan dalam aplikasi
Mirip dengan AddressSanitizer, HWASan tidak dapat melihat ke dalam kode Java, tetapi LLM dapat mendeteksi bug dalam library JNI. Hingga Android 14, menjalankan HWASan aplikasi pada perangkat non-HWASan tidak didukung.
Pada perangkat HWASan, aplikasi dapat diperiksa dengan HWASan dengan membangun
kode dengan SANITIZE_TARGET:=hwaddress
inci
Make, atau -fsanitize=hwaddress
dalam tanda compiler.
Di perangkat non-HWASan (menjalankan Android 14 atau yang lebih baru), setelan file wrap.sh
LD_HWASAN=1
harus ditambahkan.
Lihat
dokumentasi developer aplikasi
untuk mengetahui detail selengkapnya.