Android NDK รองรับ HWAddress Sanitizer หรือที่รู้จักกันในชื่อ HWASan โดยเริ่มต้นใช้งาน พร้อม NDK r21 และ Android 10 (API ระดับ 29) HWASan มีให้บริการในแบบ 64 บิตเท่านั้น เปิดระบบอุปกรณ์
HWASan เป็นเครื่องมือตรวจสอบข้อผิดพลาดด้านหน่วยความจําที่คล้ายกับ ASan เมื่อเทียบกับแบบคลาสสิก ASan, HWASan มี
- โอเวอร์เฮดของ CPU ที่คล้ายกัน (ประมาณ 2 เท่า)
- โอเวอร์เฮดขนาดโค้ดที่คล้ายกัน (40 – 50%)
- โอเวอร์เฮดของ RAM น้อยกว่ามาก (10% - 35%)
HWASan ตรวจพบข้อบกพร่องชุดเดียวกันกับ ASan
- สแต็กและฮีปบัฟเฟอร์ล้นหรือล้นเกิน
- การใช้ฮีปหลังจากฟรี
- การใช้สแต็กนอกขอบเขต
- Double Free หรือ Wild Free
นอกจากนี้ HWASan ยังตรวจพบสิ่งต่อไปนี้ด้วย
- การใช้สแต็กหลังจากการส่งคืน
แอปตัวอย่าง
ตัวอย่างแอป แสดงวิธีกำหนดค่าเวอร์ชันบิลด์สำหรับ Hwasan
สร้าง
หากต้องการสร้างโค้ดเนทีฟ (JNI) ของแอปด้วย HWAddress Sanitizer ให้ทำดังนี้ ดังต่อไปนี้:
Ndk-Build
ในไฟล์ 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
ผู้ผลิต
ในไฟล์ build.gradle
ของโมดูล:
android {
defaultConfig {
externalNativeBuild {
cmake {
# Can also use system or none as ANDROID_STL, but not c++_static.
arguments "-DANDROID_STL=c++_shared"
}
}
}
}
สำหรับแต่ละเป้าหมายใน CMakeLists.txt
target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)
เมื่อใช้ NDK 27 หรือใหม่กว่า คุณยังใช้สิ่งต่อไปนี้ใน build.gradle
ได้ด้วย
และไม่ต้องเปลี่ยน CMakeLists.txt:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_SANITIZE=hwaddress"
}
}
}
}
คำสั่งนี้จะใช้งานไม่ได้เมื่อใช้ ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false
Android 14 ขึ้นไป: เพิ่ม wrap.sh
หากคุณใช้ Android 14 ขึ้นไป คุณสามารถใช้ สคริปต์ wrap.sh เพื่อเรียกใช้แอปที่แก้ไขข้อบกพร่องได้ในเว็บไซต์ อุปกรณ์ที่ใช้ระบบ Android คุณข้ามขั้นตอนนี้ได้หากเลือกทำตามขั้นตอน ในวิธีการตั้งค่า
ทำตามวิธีการเพื่อ
ทำแพ็กเกจสคริปต์ wrap.sh เพื่อเพิ่มฟังก์ชัน
สคริปต์ wrap.sh ต่อไปนี้สำหรับ arm64-v8a
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
เรียกใช้
หากใช้ Android เวอร์ชันที่เก่ากว่า 14 หรือไม่ได้เพิ่ม wrap.sh ให้ทำตามคำแนะนำการตั้งค่าก่อนเรียกใช้แอป
เรียกใช้แอปตามปกติ เมื่อตรวจพบข้อผิดพลาดของหน่วยความจํา แอปขัดข้องด้วย
SIGABRT และพิมพ์ข้อความโดยละเอียดไปยัง Logcat สำเนาข้อความจะทำสิ่งต่อไปนี้ได้
ในไฟล์ภายใต้ /data/tombstones
และมีลักษณะดังนี้
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)
ข้อความอาจมีข้อมูลการแก้ไขข้อบกพร่องเพิ่มเติมรวมถึง รายการเทรดแบบสดในแอปพลิเคชัน แท็กของการจัดสรรหน่วยความจำใกล้เคียง ค่าการลงทะเบียน CPU
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดของ HWASan ได้ที่การทำความเข้าใจรายงาน HWASan ข้อความ
การสร้างไฟล์ปฏิบัติการบรรทัดคำสั่ง
คุณสามารถสร้างและเรียกใช้ไฟล์สั่งการที่ใช้ HWASan ใน Android 14 และ ใหม่กว่า คุณสามารถใช้การกำหนดค่าเดียวกับที่อธิบายไว้ใน Build สำหรับ ndk-build หรือ CMake สำหรับไฟล์ปฏิบัติการของคุณ พุชไฟล์ปฏิบัติการไปยังอุปกรณ์ ใช้ Android 14 ขึ้นไปและทํางานตามปกติโดยใช้ Shell
หากคุณใช้ libc++ ให้ตรวจสอบว่าคุณใช้ STL ที่แชร์อยู่และพุชไปยัง
อุปกรณ์และตั้งค่า LD_LIBRARY_PATH
เป็นไดเรกทอรีที่มีอุปกรณ์เมื่อ
ที่ใช้ไบนารีของคุณ
หากคุณไม่ได้ใช้ Gradle โปรดดูเอกสาร NDK เพื่อเรียนรู้วิธีสร้างจาก บรรทัดคำสั่งด้วย CMake และ ndk-build
Android 13 หรือเวอร์ชันก่อนหน้า: การตั้งค่า
หากอุปกรณ์ของคุณใช้ Android 14 ขึ้นไป คุณข้ามขั้นตอนนี้และทำตาม วิธีการใช้ wrap.sh ในส่วนสร้างด้านล่าง คุณยังสามารถเลือกทำตามส่วนนี้ และข้ามคำแนะนำในการใช้ wrap.sh ด้านล่าง
ก่อน Android 14 แอปพลิเคชัน HWASan ต้องใช้บิลด์ HWASan ของ Android จึงจะทำงานได้ คุณสามารถแฟลชอิมเมจ HWASan ที่สร้างไว้ล่วงหน้าไปยังอุปกรณ์ Pixel ที่รองรับได้ สิ่งที่สร้างขึ้นคือ ใน ci.android.com ซึ่งคุณสามารถคลิกรูปสี่เหลี่ยมจัตุรัสสำหรับ บิลด์ที่คุณต้องการรับลิงก์ Flash Build โดยคุณต้องทราบว่า ชื่อรหัสสำหรับโทรศัพท์ของคุณ
การไปที่ flash.android.com โดยตรงจะง่ายกว่า เนื่องจากมี ขั้นตอนเริ่มต้นจากการตรวจหาอุปกรณ์ของคุณและแสดงเฉพาะบิลด์ที่คุณใช้ได้ ภาพต่อไปนี้แสดงขั้นตอนการตั้งค่าในเครื่องมือนี้
เปิดใช้โหมดนักพัฒนาซอฟต์แวร์ในอุปกรณ์ และเชื่อมต่อกับคอมพิวเตอร์โดยใช้ สาย USB คลิกเพิ่มอุปกรณ์ใหม่ เลือกอุปกรณ์จากกล่องโต้ตอบ และ ให้คลิกเชื่อมต่อ
หลังจากเชื่อมต่ออุปกรณ์แล้ว ให้คลิกอุปกรณ์เพื่อกำหนดค่าบิลด์
ในช่องเลือกรหัสบิลด์ ให้เลือก aosp-master-with-phones-throttled
เพื่อเลือกภาพที่ถูกต้องสำหรับอุปกรณ์ที่คุณมีโดยอัตโนมัติ
เชื่อมต่อ แล้ว
คลิกติดตั้งเพื่อแฟลชอุปกรณ์
มีรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าที่จำเป็นใน เอกสาร Android Flash Tool หรือคุณสามารถตรวจสอบ เอกสารประกอบของ AOSP สำหรับวิธีการสร้างอิมเมจ HWASan จากต้นทาง