Google опубликовал GWPSan, инструмент для выявления ошибок на стадии выполнения приложений

Компания Google опубликовала исходные тексты инструментария GWPSan, предназначенного для выявления ошибок на этапе выполнения приложений, собранных для архитектур x86-64 и ARM64. GWPSan собирается в виде разделяемой библиотеки, которая связывается при запуске приложения при помощи LD_PRELOAD и использует для анализа работы программы доступные в ядре Linux механизмы остановки (PERF_TYPE_BREAKPOINT) и сэмплинга процессов. Код написан на языке С++ и распространяется под лицензией Apache 2.0.

GWPSan оформлен в виде модульного фреймворка, поддерживающего подключение модулей с реализацией детекторов различных классов ошибок. GWPSan выполняет динамический анализ, активируемый через обработчики сигналов, что позволяет обойтись без изменения исполняемого кода приложения. Для эффективной работы большинства детекторов требуется сборка приложения с определёнными флагами компилятора, добавляющими необходимые метаданные. Для работы требуется как минимум Clang 18 и ядро Linux 6.4.

В настоящее время доступно три детектора:

  • UAR (Use-after-return) – выявляет ошибки, вызванные использованием объекта в стеке после выхода из функции, в которой этот объект был определён. Защита организована через перехват точек входа и выхода для функции – при входе осуществляется подмена стека на копию для использования во время выполнения функции, а при выходе возвращается старое состояние стека.
  • TSan (Thread Sanitizer) – определяет состояния гонки между потоками (Data-race), возникающее когда разные одновременно выполняемые потоки могут читать или изменять общие области памяти, не используя при этом примитивы для синхронизации работы. Защита построена на использовании аппаратных точек останова, привязываемых к совместным областям памяти. Срабатывающий обработчик на небольшой промежуток времени приостанавливает выполнение потока при обращении к памяти и во время этой приостановки проверяет не было ли срабатывания точки останова для другого потока.
  • LMSan (Lightweight Memory Sanitizer) – определяет использование неинициализированных данных в памяти. Детектор отмечен как экспериментальный и не рекомендованный для использования.

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

Release. Ссылка here.