Введение в динамический анализ
Что такое динамический анализ?
«Инструментация» в динамическом анализе
Анализ функции abs_value
Второй тест кейс для достижения 100%
Инструмент valgrind для динамического анализа
472.03K

Введение в динамический анализ

1. Введение в динамический анализ

ВВЕДЕНИЕ В ДИНАМИЧЕСКИЙ АНАЛИЗ
ВЫПОЛНИЛИ: ХОБТА ДМИТРИЙ И ГРИЦЕНКО АЛИНА

2. Что такое динамический анализ?

ЧТО ТАКОЕ ДИНАМИЧЕСКИЙ АНАЛИЗ?
Динамический анализ – это метод анализа программы во время её
выполнения, который позволяет наблюдать за поведением ПО в реальных
условиях.
Среда выполнения:
В каких условиях запускается ПО:
1. Песочница (изолированная среда)
2. Эмулятор (виртуальное устройство/ОС)
3. Реальное железо (физическая машина)
Объекты мониторинга:
1. Состояние стека и кучи (Heap)
2. Регистры процессора
3. Таблица дескрипторов файлов
4. Активность сетевых интерфейсов

3.

Разновидности динамического анализа
Направление
Описание
Инструментарий
Профилирование
Измерение времени
выполнения функций
gprof, perf
Отладка
Пошаговое выполнение,
просмотр переменных
gdb, lldb
Трассировка
Логирование системных
вызовов
strace, ltrace
Динамический поиск
ошибок
Обнаружение утечек
памяти, ошибок доступа
Valgrind, ASan
Анализ покрытия
Определение, какие
строки кода были
выполнены
gcov, lcov

4. «Инструментация» в динамическом анализе

«ИНСТРУМЕНТАЦИЯ» В ДИНАМИЧЕСКОМ
АНАЛИЗЕ
Инструментация — внедрение дополнительного кода в программу для
сбора данных о её работе.
Классификация по моменту внедрения:
1. Source-level: модификация исходного кода перед
компиляцией.
2. Compiler-level: вставка инструкций на этапе
генерации объектного кода (через компилятор).
3. Binary-level: переписывание инструкций готового
исполняемого файла (без исходников).
Классификация по времени работы:
1. Static: до запуска программы (статическая
инструментация).
2. Dynamic: во время выполнения (Just-In-Time, JIT).

5. Анализ функции abs_value

АНАЛИЗ ФУНКЦИИ ABS_VALUE
Мы написали код:
int abs_value(int x) {
if (x >= 0)
return x;
else
return -x;
}
Написали тест:
void test_abs_value() {
abs_value(5);
}
Инструмент покрытия показал:
Строка
Выполнена?
if (x >= 0)
Да
return x;
Да
return -x;
Нет
Итоговый процент покрытия: 67%

6. Второй тест кейс для достижения 100%

ВТОРОЙ ТЕСТ КЕЙС ДЛЯ ДОСТИЖЕНИЯ 100%
void test_abs_value_negative() {
abs_value(-5); // или любое отрицательное число
}
После добавления этого теста:
1. Все строки будут выполнены.
2. Обе ветви (if и else) будут пройдены.
3. Покрытие станет 100%.

7.

Сравнительный анализ: Dynamic & Static
Критерий
Динамический анализ
Статический анализ
Когда проводится
Во время выполнения
До запуска
Требует запуска
Да
Нет
Обнаруживает
Ошибки времени
выполнения, утечки
памяти
Синтаксические ошибки,
потенциальные баги
Точность
Высокая (реальные
данные)
Может давать ложные
срабатывания
Производительность
Замедляет работу
программы
Быстрый
Примеры инструментов
Valgrind, gdb, gcov
Clang Static Analyzer,
SonarQube, ESLint
Плюсы
Реальные данные,
обнаружение runtimeошибок
Раннее обнаружение,
без запуска
Минусы
Медленный, требует
тестов
Не видит все пути
выполнения

8. Инструмент valgrind для динамического анализа

ИНСТРУМЕНТ VALGRIND ДЛЯ ДИНАМИЧЕСКОГО
АНАЛИЗА
Valgrind — набор инструментов для отладки и профилирования программ, особенно полезен для
обнаружения ошибок управления памятью.
Типовые проверки:
1. Утечки памяти (memory leaks)
2. Использование неинициализированной памяти
3. Доступ за пределами выделенного блока
4. Освобождение уже освобождённой памяти
5. Несоответствие malloc/free, new/delete

9.

ЭФФЕКТЫ
1. Heisenbugs (гейзенбаги) - ошибки, которые исчезают при попытке их отладить
— обычно из-за изменения таймингов или состояния памяти под отладчиком.
2. Probe Effect (эффект зондирования) - сам инструмент анализа влияет на
поведение системы — например, замедляет работу, меняет порядок потоков,
скрывает гонки данных.
3. Fuzzing (фаззинг) - метод динамического анализа, при котором программе
подаются случайные или malformed входные данные для поиска уязвимостей
(краши, переполнения буфера).
4. Sanitizers - инструменты вроде AddressSanitizer, ThreadSanitizer — вытесняют
Valgrind благодаря высокой скорости (всего ~2x замедление против 10–50x у
Valgrind) и хорошей детализации ошибок.
5. eBPF - технология трассировки ядра и приложений в современных Linuxсистемах без остановки процесса. Позволяет безопасно выполнять
пользовательский код в ядре для мониторинга и анализа.
English     Русский Правила