Динамический анализатор — инструмент, который обнаруживает ошибки во время выполнения программы, анализируя её поведение, использование памяти и потоки выполнения. В отличие от статического анализа, требует фактического запуска кода с тестовыми сценариями.
Инструмент от Google для обнаружения ошибок памяти.
g++ -fsanitize=address -g program.cpp
./a.out
Обнаруживает:
Для обнаружения race conditions.
g++ -fsanitize=thread -g multithreaded.cpp
./a.out
Пример вывода:
WARNING: ThreadSanitizer: data race
Write of size 4 at 0x7b0400000fe0 by thread T1
Previous read of size 4 by thread T2
Мощный инструментарий для отладки памяти и профилирования.
valgrind --leak-check=full ./my_program
Включает:
Альтернатива Valgrind для Windows/Linux.
drmemory.exe -- my_program.exe
Особенности:
Коммерческий инструмент для анализа параллельных программ.
Возможности:
Анализаторы добавляют специальный код для отслеживания:
// Оригинальный код
*ptr = value;
// Инструментированный код
if (is_memory_poisoned(ptr)) {
report_error("use-after-free");
} else {
*ptr = value;
}
Специальные структуры данных, отслеживающие состояние памяти:
# .gitlab-ci.yml пример
test_asan:
stage: test
script:
- g++ -fsanitize=address -g -O1 program.cpp
- ./a.out
test_tsan:
stage: test
script:
- g++ -fsanitize=thread -g -O1 multithread.cpp
- ./a.out
# Автоматический запуск тестов с разными санитайзерами
for sanitizer in address thread undefined; do
g++ -fsanitize=${sanitizer} -g test.cpp
./a.out
done
Инструмент | Платформы | Основная функция | Производительность |
---|---|---|---|
AddressSanitizer | Linux, macOS, Windows | Ошибки памяти | 2x замедление |
ThreadSanitizer | Linux, macOS | Гонки данных | 5-15x замедление |
Valgrind | Linux, macOS | Полный анализ памяти | 20-50x замедление |
Dr. Memory | Windows, Linux | Ошибки памяти | 10x замедление |
Intel Inspector | Windows, Linux | Многопоточные ошибки | 5-30x замедление |
Тестовое покрытие:
Комбинация инструментов:
Оптимизация производительности:
Анализ в продакшене:
Резюмируем: динамические анализаторы — незаменимый инструмент для обнаружения сложных runtime-ошибок, особенно в многопоточных и работающих с памятью приложениях. Их регулярное использование значительно повышает стабильность и надежность C/C++ программ.