GWPSan оформлен в виде модульного фреймворка, поддерживающего подключение модулей с реализацией детекторов различных классов ошибок. GWPSan выполняет динамический анализ, активируемый через обработчики сигналов, что позволяет обойтись без изменения исполняемого кода приложения. Для эффективной работы большинства детекторов требуется сборка приложения с определёнными флагами компилятора, добавляющими необходимые метаданные. Для работы требуется как минимум Clang 18 и ядро Linux 6.4.
В настоящее время доступно три детектора:
- UAR (Use-after-return) — выявляет ошибки, вызванные использованием объекта в стеке после выхода из функции, в которой этот объект был определён. Защита организована через перехват точек входа и выхода для функции — при входе осуществляется подмена стека на копию для использования во время выполнения функции, а при выходе возвращается старое состояние стека.
- TSan (Thread Sanitizer) — определяет состояния гонки между потоками (Data-race), возникающее когда разные одновременно выполняемые потоки могут читать или изменять общие области памяти, не используя при этом примитивы для синхронизации работы. Защита построена на использовании аппаратных точек останова, привязываемых к совместным областям памяти. Срабатывающий обработчик на небольшой промежуток времени приостанавливает выполнение потока при обращении к памяти и во время этой приостановки проверяет не было ли срабатывания точки останова для другого потока.
- LMSan (Lightweight Memory Sanitizer) — определяет использование неинициализированных данных в памяти. Детектор отмечен как экспериментальный и не рекомендованный для использования.
GWPSan анализирует исполняемый код программы, используя фреймворк DynamoRIO для декодирования машинного кода в абстрактные инструкции ISA, которые затем выполняются с использованием эмуляции. Через периодические сигналы от таймера вызывается обработчик unified, который при каждом вызове выполняет определённую порцию инструкций для анализируемого потока. В случае обнаружения при выполнении определённых инструкций, запускается специфичный для данных инструкций детектор проблем, например, для инструкций, обращающихся к памяти, запускается детектор состояний гонки.
Источник: http://www.opennet.ru/opennews/art.shtml?num=61317