Символьное исполнение - это техника автоматизированного тестирования и анализа программного обеспечения, которая набирает популярность в последние годы. Она работает путем исследования различных путей выполнения программы для поиска входных данных, которые вызывают определенное поведение, ведущее к ошибкам, сбоям или нарушениям спецификаций программы.
Символьное исполнение необходимо, потому что традиционные методы тестирования, такие как ручное тестирование или простое случайное тестирование, часто неэффективны при обнаружении редких и сложных дефектов и уязвимостей в программных системах. В отличие от этого, оно может обеспечить более всестороннее покрытие пространства выполнения программы, что позволяет выявлять дефекты и уязвимости, которые традиционные методы тестирования упускают.
Однако данный метод может столкнуться с проблемами при анализе, поскольку требует значительных вычислительных ресурсов, особенно для сложных и больших программных систем. Более того, символьное исполнение анализирует только некоторую модель программы, что означает, что анализ может допускать ошибки, приводящие к ложным срабатываниям. Например, когда программа имеет большое количество путей выполнения или когда символьная виртуальная машина выполнения сталкивается с циклами, объем вычислений, необходимых для исследования всех возможных путей, может стать невозможным для дальнейшего анализа. Кроме того, иногда анализ ошибочно идентифицирует ошибки, когда они на самом деле их нет, что приводит к ложным тревогам. Это может привести к долгому времени анализа, его ненадежности или даже привести к сбою анализа, что затрудняет применение данной техники на практике.
Для решения этих проблем в данном дипломе представлена разработка виртуальной машины динамического символьного исполнения для языков программирования Java и Kotlin, расширяющую уже реализованную подсистему символьного исполнения подсистемой конкретного исполнения с целью уменьшения количества ложных срабатываний и увеличения покрытия кода. Виртуальная машина (движок) реализует подход, который объединяет оба подхода, чтобы повысить эффективность и надежность анализа кода. Такая комбинация позволяет выполнять программу символьно и конкретно, уменьшая неточности чистого символьного исполнения и повышая качество анализа и покрытие анализируемой программы. Все это делает анализ более практичным и применимым для тестирования и анализа программного обеспечения.
Этот диплом описывает дизайн и реализацию виртуальной машины, включая архитектуру конкретного движка, структуры данных и алгоритмы. Также представлены экспериментальные результаты, которые позволяют дальнейший анализ эффективности виртуальной машины в обнаружении дефектов и уязвимостей в реальных программах.
Более того, подсистема конкретного исполнения, представленная в данном дипломе, интегрирована в инструмент UnitTestBot - автоматизированную систему генерации модульных тестов для языков программирования Java и Kotlin. UnitTestBot реализует чистый символьный подход с расширенными возможностями, которые улучшают анализ кода и качество генерируемых тестов. Эта интеграция позволяет применять UnitTestBot более уверенно, обеспечивая эффективное тестирование больших и сложных программ и программных систем...
Данный диплом достиг своей цели. Разработана и реализована виртуальная машина для динамического символьного исполнения на языках программирования Java и Kotlin на основе уже имеющегося символьного движка и прототипа подсистемы конкретного исполнения в UnitTestBot. Разработанная подсистема также интегрирована в инструмент UnitTestBot, что сделало генерацию тестов более надежной без снижения покрытия кода. В процессе реализации были получены следующие результаты:
1. Проведен обзор существующих инструментов, основанных на динамическом символьном исполнении: JDart, ACTEve и Triton;
2. Изучена структура и кодовая база инструмента UnitTestBot;
3. Разработана и реализована архитектура подсистемы конкретного исполнения, взяв за основу, доработав и улучшив уже готовый прототип данной подсистемы;
4. Реализованная подсистема интегрирована в UnitTestBot, тем самым получена виртуальная машина для динамического символьного исполнения, поддерживающая языки программирования Java и Kotlin;
5. Установлено, что реализованный движок улучшает генерацию тестов путем существенного сокращения числа некорректных и ненадежных тестов без потери покрытия кода;
6. Получены новые возможности для разработки и реализации новых подсистем и алгоритмов для улучшения качества UnitTestBot, в частности, уже реализованные модули фаззинга и минимизации.
7. UnitTestBot с реализованной подсистемой конкретного исполнения принял участие в соревновании по генерации тестов для Java, SBFT 2023, где занял второе место, показав хорошие результаты работы на реальных проектах.