Тема: Разработка виртуальной машины динамического символьного исполнения для языков программирования Java и Kotlin
Закажите новую по вашим требованиям
Представленный материал является образцом учебного исследования, примером структуры и содержания учебного исследования по заявленной теме. Размещён исключительно в информационных и ознакомительных целях.
Workspay.ru оказывает информационные услуги по сбору, обработке и структурированию материалов в соответствии с требованиями заказчика.
Размещение материала не означает публикацию произведения впервые и не предполагает передачу исключительных авторских прав третьим лицам.
Материал не предназначен для дословной сдачи в образовательные организации и требует самостоятельной переработки с соблюдением законодательства Российской Федерации об авторском праве и принципов академической добросовестности.
Авторские права на исходные материалы принадлежат их законным правообладателям. В случае возникновения вопросов, связанных с размещённым материалом, просим направить обращение через форму обратной связи.
📋 Содержание
Постановка задачи 6
1. Обзор 7
1.1. Символьное исполнение 7
1.2. SMT-решатели 8
1.3. Динамическое символьное исполнение 9
1.4. Существующие решения 10
1.5. UnitTestBot 12
2. Описание реализации 15
2.1. Архитектура подсистемы 16
2.2. Запуск конкретного движка 18
2.3. Инструментация байт-кода 19
2.4. Межпроцессное общение 22
2.5. Интеграция в UnitTestBot 24
2.6. Процесс исполнения 25
2.7. Поддержка мокирования 28
2.7.1 Мокирование объектов 29
2.7.2 Мокирование статических функций 30
2.7.3 Мокирование создания объектов 31
2.8. Обработка недетерминированного поведения 33
2.9. Поддержка Kotlin 35
3. Тестирование и результаты 36
3.1. Тестирование корректности подсистемы 36
3.2. Оценка эффективности подсистемы 37
3.2.1 Измерения 37
3.2.2 Результаты 38
3.3. Расширения UnitTestBot 39
3.3.1 Минимизация 39
3.3.2 Фаззинг 40
3.4. Результаты обнаружения недетерминированного поведения 41
3.5. SBFT2023 43
3.6. Будущие улучшения 44
Заключение 46
Список литературы 47
📖 Введение
Символьное исполнение необходимо, потому что традиционные методы тестирования, такие как ручное тестирование или простое случайное тестирование, часто неэффективны при обнаружении редких и сложных дефектов и уязвимостей в программных системах. В отличие от этого, оно может обеспечить более всестороннее покрытие пространства выполнения программы, что позволяет выявлять дефекты и уязвимости, которые традиционные методы тестирования упускают.
Однако данный метод может столкнуться с проблемами при анализе, поскольку требует значительных вычислительных ресурсов, особенно для сложных и больших программных систем. Более того, символьное исполнение анализирует только некоторую модель программы, что означает, что анализ может допускать ошибки, приводящие к ложным срабатываниям. Например, когда программа имеет большое количество путей выполнения или когда символьная виртуальная машина выполнения сталкивается с циклами, объем вычислений, необходимых для исследования всех возможных путей, может стать невозможным для дальнейшего анализа. Кроме того, иногда анализ ошибочно идентифицирует ошибки, когда они на самом деле их нет, что приводит к ложным тревогам. Это может привести к долгому времени анализа, его ненадежности или даже привести к сбою анализа, что затрудняет применение данной техники на практике.
Для решения этих проблем в данном дипломе представлена разработка виртуальной машины динамического символьного исполнения для языков программирования Java и Kotlin, расширяющую уже реализованную подсистему символьного исполнения подсистемой конкретного исполнения с целью уменьшения количества ложных срабатываний и увеличения покрытия кода. Виртуальная машина (движок) реализует подход, который объединяет оба подхода, чтобы повысить эффективность и надежность анализа кода. Такая комбинация позволяет выполнять программу символьно и конкретно, уменьшая неточности чистого символьного исполнения и повышая качество анализа и покрытие анализируемой программы. Все это делает анализ более практичным и применимым для тестирования и анализа программного обеспечения.
Этот диплом описывает дизайн и реализацию виртуальной машины, включая архитектуру конкретного движка, структуры данных и алгоритмы. Также представлены экспериментальные результаты, которые позволяют дальнейший анализ эффективности виртуальной машины в обнаружении дефектов и уязвимостей в реальных программах.
Более того, подсистема конкретного исполнения, представленная в данном дипломе, интегрирована в инструмент UnitTestBot1 - автоматизированную систему генерации модульных тестов для языков программирования Java и Kotlin. UnitTestBot реализует чистый символьный подход с расширенными возможностями, которые улучшают анализ кода и качество генерируемых тестов. Эта интеграция позволяет применять UnitTestBot более уверенно, обеспечивая эффективное тестирование больших и сложных программ и программных систем.
Инструмент UnitTestBot также предоставляет такую функциональность, как символьное исполнение, фаззинг, генерацию мок-объектов и минимизацию тестов, что дополнительно улучшает эффективность тестирования на основе динамического символьного исполнения. Подсистема конкретного исполнения разработана таким образом, чтобы легко интегрироваться в существующие рабочие процессы разработки данного продукта.
В целом, реализация виртуальной машины динамического символьного исполнения в UnitTestBot обеспечивает эффективное решение для автоматической генерации и анализа тестов. Этот диплом вносит вклад в развитие программной инженерии, предоставляя практический и эффективный подход для обеспечения качества и надежности разрабатываемых программ.
✅ Заключение
1. Проведен обзор существующих инструментов, основанных на динамическом символьном исполнении: JDart, ACTEve и Triton;
2. Изучена структура и кодовая база инструмента UnitTestBot;
3. Разработана и реализована архитектура подсистемы конкретного исполнения, взяв за основу, доработав и улучшив уже готовый прототип данной подсистемы;
4. Реализованная подсистема интегрирована в UnitTestBot, тем самым получена виртуальная машина для динамического символьного исполнения, поддерживающая языки программирования Java и Kotlin;
5. Установлено, что реализованный движок улучшает генерацию тестов путем существенного сокращения числа некорректных и ненадежных тестов без потери покрытия кода;
6. Получены новые возможности для разработки и реализации новых подсистем и алгоритмов для улучшения качества UnitTestBot, в частности, уже реализованные модули фаззинга и минимизации.
7. UnitTestBot с реализованной подсистемой конкретного исполнения принял участие в соревновании по генерации тестов для Java, SBFT 2023, где занял второе место, показав хорошие результаты работы на реальных проектах.





