Android NDK поддерживает HWAddress Sanitizer , также известный как HWASan, начиная с NDK r21 и Android 10 (уровень API 29). HWAsan доступен только на 64-битных устройствах Arm.
HWASan — это инструмент обнаружения ошибок памяти, аналогичный ASan. По сравнению с классическим ASan, HWASan имеет:
- Аналогичная нагрузка на ЦП (~ 2 раза)
- Накладные расходы на аналогичный размер кода (40–50 %)
- Гораздо меньшие затраты на ОЗУ (10–35%)
HWASan обнаруживает тот же набор ошибок, что и ASan:
- Переполнение или опустошение буфера стека и кучи
- Куча использования после бесплатного
- Использование стека за пределами области действия
- Двойное бесплатное или дикое бесплатное
Кроме того, HWAsan также обнаруживает:
- Использование стека после возврата
Пример приложения
В примере приложения показано, как настроить вариант сборки для хвасан.
Строить
Чтобы создать собственный код (JNI) вашего приложения с помощью HWAddress Sanitizer , выполните следующие действия:
ndk-сборка
В вашем файле 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
В файле 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)
За сообщением может следовать дополнительная информация об отладке, включая список активных потоков в приложении, теги близлежащих выделений памяти и значения регистров ЦП.
Дополнительные сведения о сообщениях об ошибках HWASan см. в разделе «Понимание отчетов HWASan» .
Создание исполняемых файлов командной строки
Вы можете создавать и запускать исполняемые файлы, оснащенные HWASan, на Android 14 и более поздних версиях. Вы можете использовать ту же конфигурацию, которая описана в разделе Сборка для ndk-build или CMake для ваших исполняемых файлов. Отправьте исполняемые файлы на устройство под управлением Android 14 или новее и запустите его как обычно, используя оболочку.
Если вы используете 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 из исходного кода.