Тема: Применение двунаправленного исполнения для вывода индуктивных инвариантов в символьной виртуальной машине KLEE
Закажите новую по вашим требованиям
Представленный материал является образцом учебного исследования, примером структуры и содержания учебного исследования по заявленной теме. Размещён исключительно в информационных и ознакомительных целях.
Workspay.ru оказывает информационные услуги по сбору, обработке и структурированию материалов в соответствии с требованиями заказчика.
Размещение материала не означает публикацию произведения впервые и не предполагает передачу исключительных авторских прав третьим лицам.
Материал не предназначен для дословной сдачи в образовательные организации и требует самостоятельной переработки с соблюдением законодательства Российской Федерации об авторском праве и принципов академической добросовестности.
Авторские права на исходные материалы принадлежат их законным правообладателям. В случае возникновения вопросов, связанных с размещённым материалом, просим направить обращение через форму обратной связи.
📋 Содержание
Постановка задачи 5
1. Обзорный раздел по предметной области 6
1.1. Подходы к автоматической генерации тестовых данных 6
1.1.1 Поведенческое тестирование 6
1.1.2 Структурное тестирование 7
1.2. Механизм работы символьного исполнения 11
1.3. Подходы к выводу лемм и их проверке на инвариантность 14
1.4. Инструменты с открытым исходным кодом 15
1.5. Выводы 17
2. Алгоритм вывода индуктивных инвариантов 18
2.1. Индуктивный инвариант 18
2.2. Двунаправленное исполнение 18
2.3. Алгоритм вывода лемм 21
2.4. Алгоритм проверки индуктивности лемм 23
2.5. Реализация алгоритма в символьной машине KLEE 23
2.5.1 Модуль ReachabilityTracker 24
2.5.2 Проверка лемм на индуктивность 24
3. Тестирование 26
3.1. Тестовая инфраструктура 26
3.2. Результаты 26
3.3. Выводы 27
3.4. Дальнейшее развитие 28
Заключение 29
Список литературы 30
📖 Введение
Важным шагом в развитии тестирования программного обеспечения является автоматизация генерации тестов, позволяющая освободить разработчиков от одной из тяжёлых и трудоёмких частей производства продукта [1]. Основная проблема автоматизации тестирования состоит в том, что количество путей исполнения в программе может быть сколь угодно большим. Следовательно, автоматический генератор тестов должен создать столько входных аргументов для тестируемой функции, сколько необходимо для покрытия максимально возможного количества путей исполнения.
Современные подходы к решению этой проблемы являются комбинацией поведенческого (black-box test generation) и структурного (white-box test generation) тестирования [2]. Традиционным примером поведенческого тестирования является генерация случайных входных данных для программы (или же «фаззинг»), а структурного — символьное исполнение. Если сравнить поведенческое и структурное тестирование, то можно отметить, что поведенческое тестирование быстрее анализирует пути исполнения, однако обладает неточностью, поскольку не покрывает редкие, труднодостижимые пути. Наоборот, структурное тестирование отличается своей точностью, но работает медленнее, так как сталкивается с проблемой «взрыва числа путей исполнения» [3]. «Взрыв путей» происходит из-за того, что условные операторы и операторы цикла экспоненциально увеличивают количество возможных путей исполнения программы. На практике большая часть путей не представляет интереса для тестирования, поскольку не добавляет нового поведения в сравнении с уже проанализированными. Проблеме «экспоненциального взрыва» уделяется большое внимание со стороны научного сообщества [4, 5, 6].
Одним из возможных подходов структурного анализа является прямое символьное исследование кода программы, а именно символьное исполнение от точки входа. Но такой способ не может осуществить направленное исследование к конкретной инструкции в коде. В дополнение к прямому можно использовать обратное символьное исполнение, позволяющее запустить исследование в направлении от целевой инструкции к точке входа [7]. И в том, и в другом случае существует проблема анализа большого числа абстрактных путей, не реализующихся в реальности. Эффективной комбинацией этих двух подходов является двунаправленное символьное исполнение [8].
Двунаправленное исполнение может помочь в решении основной проблемы символьного исполнения — проблемы «взрыва путей». При анализе вопроса «экспоненциального взрыва» можно обнаружить, что не всегда различное количество итераций цикла будет приводить к отличающимся результатам работы программы. Существуют ситуации, в которых программа сохраняет свойство некоторого состояния вне зависимости от числа итераций цикла, другими словами, поддерживает инвариант. Инвариантами можно воспользоваться для уменьшения числа путей анализа программы, чтобы отбрасывать заведомо недостижимые участки кода.
Одним из популярных и широко используемых инструментов с открытым исходным кодом, который занимается автоматической генерацией тестов на основе символьного исполнения, является KLEE [9].
Данная работа посвящена улучшению анализа кода символьной виртуальной машиной KLEE путём внедрения вывода индуктивных инвариантов при помощи стратегии двунаправленного исполнения.
✅ Заключение
• Проведён обзор существующих подходов и решений в области вывода индуктивных инвариантов среди инструментов автоматической генерации тестов 2LS, Angr и KLEE. В ходе обзора в качестве основы для реализации алгоритма был выбран инструмент KLEE.
• Разработан эффективный алгоритм проверки лемм на индуктивность с применением двунаправленного символьного исполнения. Описаны необходимые модификации исходного алгоритма двунаправленного исполнения для внедрения возможности проверки лемм на индуктивность.
• Полученный алгоритм реализован в виртуальной символьной машине KLEE. Описаны необходимые структуры данных и детали реализации.
• Проведено тестирование реализации на проверочных данных соревнования SVComp. Модифицированная версия KLEE в 67% случаев позволила вывести индуктивный инвариант, тем самым упростив символьной машине анализ программы. Однако в ситуациях, когда потенциальная лемма-инвариант не встречается в качестве инструкции, алгоритм не улучшает анализ кода.





