Введение
Глава 1. Поиск ошибок в исходном коде 10
1.1. Использование статического анализатора в жизненном цикле разработки программ 10
1.2. Ошибки в исходном коде 12
1.3. Корректность анализа 15
1.4. Синтаксические анализаторы 16
1.5. Обзор существующих семантических анализов 17
1.6. Анализатор Svace 27
Глава 2. Анализируемый язык 32
2.1. Промежуточное представление Svace 32
2.2. Описание языка svaceO 32
2.3. Структурная операционная семантика языка 36
2.4. Функция на языке svaceO 40
Глава 3. Внутрипроцедурный анализ 42
3.1. Используемый подход 42
3.2. Идентификаторы значений и ссылки 44
3.3. Передаточные функции 50
3.4. Анализ циклов 53
3.5. Корректность анализа 55
3.6. Сильные и слабые обновления 65
3.7. Слияние состояний 67
3.8. Пример анализа 68
3.9. Массивы, объединения, приведения типов 70
Глава 4. Детекторы 73
4.1. Атрибуты 73
4.2. Критерий выдачи з
4.3. События 78
4.4. Вспомогательные атрибуты 80
4.5. Разыменование нулевого указателя 80
4.6. Обратный анализ 83
4.7. Сопоставление атрибутов ссылкам 85
4.8. Чувствительность к путям 87
Глава 5. Межпроцедурный анализ 92
5.1. Резюме функции 92
5.2. Создание резюме функции 93
5.3. Трансляция резюме в контекст вызова 97
5.4. Отложенное слияние для параметров функций 100
5.5. Трассы атрибутов 102
5.6. Параметризованные атрибуты 103
5.7. Удаление резюме 104
5.8. Анализ конструкторов и деструкторов 105
Глава 6. Реализация 108
6.1. Инструмент Svace 108
6.2. Трансляция Си и Си++-кода в LLVM 110
6.3. Вспомогательные алгоритмы 112
6.4. Создание резюме 115
6.5. Оценка времени анализа 115
6.6. Оценка выданных предупреждений 117
Заключение 122
Список сокращений и условных обозначений 124
Список литературы


