Введение
1 Применение промежуточных представлений в статическом анализе программ 16
1.1 Статический анализ 16
1.2 Промежуточные представления 16
1.3 Требования к промежуточному представлению 18
1.4 Используемые представления в существующих инструментах статического анализа и компиляции
1.4.1 Абстрактное синтаксическое дерево 20
1.4.2 GIMPLE 21
1.4.3 LLVMIR 22
1.4.4 SSA 22
1.4.5 Представления Вauhaus 23
1.4.6 Представление Malpas
1.5 Характеристика существующих промежуточных представлений в соответствии с требованиями 24
1.6 Разрабатываемое представление 25
1.7 Объектно-ориентированные языки программирования 26
1.8 Математическая модель классового представления
1.8.1 Связи наследования 29
1.8.2 Связи агрегации 29
1.9 Универсальное классовое представление 31
2 Особенности статического анализа динамических языков 34
2.1 Динамические языки программирования 34
2.2 Проблема извлечения классового представления в динамических языках
2.3 Существующие решения 35
2.3.1 Алгоритм Хиндли-Милнера 36
2.3.2 Алгоритм Декартова произведения 38
2.3.3 Заключение по существующим алгоритмам вывода типов 40
2.3.4 Существующие инструменты вывода типов для Python 41
2.3.5 Pylint 42
2.3.6 Pysonar 2.4 Предлагаемая методика вывода типов 46
2.5 Описание базовой модели типов 47
2.5.1 Характеристическая сигнатура 47
2.5.2 Предлагаемая модель типов в динамических языках программирования 48
2.6 Численная оценка результатов извлечения типов 51
2.7 Применение нечетких множеств
2.7.1 Ограничения базовой модели 53
2.7.2 Математическая модель типов в динамических языках программирования на основе нечетких множеств 54
2.7.3 Функция принадлежности «capacity» 56
2.7.4 Функция принадлежности «frequency» 57
2.7.5 Пример применения функций принадлежности алгоритмом вывода типов 59
2.8 Применение динамического анализа для проверки адекватности математической модели 61
2.8.1 Результаты для программы logilab 66
2.8.2 Результаты для программы pylint 67
2.8.3 Результаты для программы bazaar 67
2.8.4 Выводы 68
2.9 Результаты для различных значений порога 68
3 Разработанный комплекс программ для статического анализа 72
3.1 Обзор разработанных инструментов анализа 72
3.2 Обработка XML 73
3.3 Извлечение представлений UCR и UCFR для Python 73
3.4 Реализация методики вывода типов при генерации промежуточных представлений для языка Python 76
3.5 Связывание представлений 77
3.6 Инструменты визуального анализа 77
3.6.1 Визуальное представление диаграммы классов 79
3.7 Анализ иерархии наследования на предмет корректного выделения методов в суперклассах 82
3.8 Технология выполнения срезов представлений
3.8.1 Срез на основе одного представления 86
3.8.2 Срез на основе нескольких представлений 87
3.8.3 Реализованные срезы 87
3.8.4 Срез наследования представления UCR 89
3.8.5 Срез вызовов представления UCFR 91
3.8.6 Срез классов представления UCFR 93
3.8.7 Срез создаваемых объектов представления UCR 93
Заключение 96
Список сокращений и условных обозначений 97
Список литературы 98
Список иллюстративного материала 111
Приложения 112
Исходный код программного модуля для извлечения универсального классового представления из исходного кода на языке программирования Python


