Для разработчиков приложений Android экосистема разработки предлагает ряд компонентов, среди которых наиболее важными являются дезинфицирующие средства Android. Другими важными компонентами, которые также часто используются, являются AddressSanitizers, SanitizerCoverage и UndefinedBehaviourSanitizer. Будучи дезинфицирующим средством на основе компилятора, эти компоненты являются исключительными для использования в целях тестирования и разработки для устранения ошибок. Это помогает экосистеме Android работать намного лучше.

Android в настоящее время получил поддержку дезинфицирующих средств, которые можно использовать только для диагностики ошибок памяти. В этой статье мы подробно расскажем о вышеупомянутых дезинфицирующих средствах Android, чтобы получить реальное представление о том, как эти элементы работают. Продолжайте читать, чтобы узнать, как эти системы можно использовать для расширения возможностей системы сборки Android.

АдресДезинфицирующее средство

Будучи компонентом на основе компилятора, AddressSanitizer (ASan) представляет собой инструмент для точного обнаружения во время выполнения различных типов ошибок памяти в коде C и C++. В Android тестировались следующие классы памяти:

  • Неограниченный доступ к куче, стеку и глобальным переменным
  • Использование после освобождения
  • Использование-после-возврата (флаг времени выполненияASAN_OPTIONS=detect_stack_use_after_return=1)
  • Использование после области действия (флаг clang -fsanitize-address-use-after-scope)
  • Двойной бесплатный, недействительный бесплатный

AddressSanitizer получил поддержку двух высокоуровневых компонентов. Один включает функциональные вызовы, связанные с памятью, такие как alloca, malloc и free, которые содержат информацию для отслеживания выделения памяти и статистики использования. Это помогает (ASan) выявлять ошибки использования памяти, такие как область использования после, освобождение, возврат, а также двойное освобождение. ASan использует теневую память, чтобы определить, какой тип памяти является полностью отравленным или полностью нормальным.

UndefinedBehaviourSanitizer или UBsan

UndefinedBehaviourSanitizer или UBSan используется для проверки различных типов неопределенного поведения. В случае, если производители устройств захотят включить то же самое в свои тестовые сборки, они могут сделать это с помощью LOCAL_SANITIZE:=default-ub в своих make-файлах или default-ub: true в блоке очистки файлов схемы. Хотя UndefinedBehaviourSanitizer или UBSan были разработаны специально для выявления неопределенного поведения, Android изначально поддерживает:

  • логический
  • Целочисленное деление на ноль
  • Возвращение
  • Возвращает ненулевой атрибут
  • Shift-экспонента
  • недостижимый
  • Вла-связанный

Система сборки Android также использует проверку целочисленного переполнения UBsan. Инструмент также обеспечивает поддержку переполнения целого числа без знака. Это не является технически неопределенным поведением, но оно все равно учитывается в дезинфицирующем средстве. Их можно легко включить в make-файлы, установив параметр LOCAL_SANITIZE для знакового целочисленного переполнения, беззнакового целочисленного переполнения или целочисленного комбинированного флага. Этот параметр включает настройку: целочисленное-переполнение со знаком, целочисленное-переполнение без знака, целое-деленное-на-ноль, сдвиг-экспонента и сдвиг-база. Этот параметр также можно включить в файлах чертежей, включив Misc_undefines для необходимого флага.

Дезинфицирующее средствоПокрытие

С помощью SanitizerCoverage покрытие кода можно использовать на разных уровнях, включая уровень вызова, базовый уровень блока или уровень границы. Эти коды можно использовать отдельно или в сочетании с дезинфицирующими средствами Android, такими как UndefinedBehaviourSanitizer, то есть UBSan и AddressSanitizer. Кроме того, чтобы использовать покрытие на основе защиты, можно установить следующие параметры: fsanitize-coverage=trace-pc-guard. Это инициирует компилятор для внедрения параметра как: sanitizer_cov_trace_pc_guard(&guard_variable) на определенном крае. Каждое ребро имеет свою собственную переменную uint32_t guard_variable. Кроме того, также создается конструктор модуля __sanitizer_cov_trace_pc_guard_init(uint32_t* start, uint32_t* stop). Все функции __sanitizer_cov_ важно предоставить пользователю.

В дополнение к этому покрытие Sanitizer также может использоваться для покрытия данных. Активация выполняется с помощью fsanitize-coverage=trace-cmp, а изменения реализуются с помощью функций __sanitizer_cov_trace_*. Данные функции аналогичны целочисленному делению и инструкциям GEP, активируемым с помощью fsanitize-coverage=trace-div и fsanitize-coverage=trace-gep соответственно.

Кроме того, существует два разных файла, а именно файл .sancov и файл sancov.map, в котором информация записывается во время сеанса дезинфицирующего покрытия. Файл .sancov содержит всю информацию, относящуюся к инструментальным точкам в программе, а второй файл имеет трассировку выполнения, представленную в виде последовательности в первом файле. И по умолчанию для этих файлов используется текущий рабочий каталог.

Эта статья первоначально опубликована здесь.