Введение 3
Постановка задачи 5
1. Обзор предметной области 6
1.1. Термины 6
1.2. Абстрактная интерпретация 8
1.3. Числовой анализ 9
1.4. Числовые абстрактные домены 11
1.5. Интервальный анализ 12
1.6. Мотивирующий пример 14
2. Реализация интервального анализа 16
2.1. Существующие подходы 16
2.2. Интервальный домен 18
2.3. Оператор расширения 20
2.4. Обработка ограничивающих условий 21
2.5. Детали реализации 23
2.5.1 Приведение к Int32, Uint32 23
2.5.2 NaN как результат арифметической операции 24
2.5.3 Обновление абстрактных значений при обработке операторов сравнения 24
2.6. Применения для поиска уязвимостей 25
3. Результаты 27
3.1. Результаты на интеграционных тестах 27
3.2. Результаты на реальных данных 27
Заключение 29
Список литературы 30
Анализ кода - это процесс изучения и оценки программного кода с целью выявления ошибок, уязвимостей, участков неэффективного кода, а также обнаружения потенциальных проблем, которые могут возникнуть во время выполнения программы. Существует два основных подхода к анализу кода: статический анализ, который проводится без фактического выполнения программы, и динамический анализ, при котором код анализируется непосредственно во время выполнения.
Есть несколько популярных методов статического анализа кода. Одним из них является абстрактная интерпретация, которая позволяет анализировать программу, моделируя её поведение не на уровне конкретных значений, а на более абстрактном уровне, что позволяет выявить потенциальные проблемы на более широком спектре сценариев выполнения кода. В данном подходе во время анализа для каждой точки программы строится абстрактное состояние, которое является аппроксимацией возможных конкретных состояний в этой точке.
Основными преимуществами абстрактной интерпретации являются возможность автоматизации анализа, выявление ошибок до выполнения программы и возможность анализа больших и сложных программ. Однако этот метод также имеет свои недостатки, которые связаны с использованием аппроксимаций значений переменных и состояний программы. Из-за этого анализ может быть недостаточно точным, а также есть вероятность ложных срабатываний.
Во время анализа каждой переменной сопоставляется значение из абстрактного домена, представляющего собой специализированную математическую структуру. Эти абстрактные значения используются для аппроксимации множеств возможных значений переменных программы. Каждый абстрактный домен предоставляет определённые операции и свойства, которые помогают анализатору интерпретировать и анализировать код программы. Выделяют отдельные абстрактные домены для чисел, строк, булевых значений, которые позволяют аппроксимировать возможные значения для переменных соответствующих типов.
Одним из методов работы с числовым абстрактным доменом является интервальный анализ, который позволяет анализировать программный код, сопоставляя переменной интервал возможных значений в каждой точке выполнения программы. Этот подход позволяет обнаруживать переполнения переменных, неявные привидения типов и другие проблемы, связанные с диапазонами значений переменных.
Научная ценность данной работы заключается в проектировании и разработке абстрактного домена для интервального анализа путём абстрактной интерпретации. Результаты исследования будут полезны для разработчиков инструментов статического анализа проектов на языке JavaScript, а также для научного сообщества, занимающегося абстрактной интерпретацией и интервальным анализом.
В рамках данной работы были успешно выполнены следующие задачи:
• Проведён анализ существующих числовых абстрактных доменов, подходящих для интервального анализа
• Спроектирован абстрактный интервальный домен, который удовлетворяет поставленным требованиям
• Реализованы необходимые операторы и арифметика над спроектированным доменом
• Реализована поддержка ограничений, накладываемых при анализе операторов ветвления и циклов
• Проведены замеры производительности и точности разработанного интервального анализа на реальных проектах
• Проведено сравнение полученных результатов с анализом распространения констант
Содержание бакалаврской работы - Реализация интервального анализа путём абстрактной интерпретации для поиска уязвимостей в проектах на языке JavaScript
Выдержки из бакалаврской работы - Реализация интервального анализа путём абстрактной интерпретации для поиска уязвимостей в проектах на языке JavaScript