Тип работы:
Предмет:
Язык работы:


Динамическое символьное исполнение для языка Python

Работа №144932

Тип работы

Дипломные работы, ВКР

Предмет

программирование

Объем работы40
Год сдачи2024
Стоимость4800 руб.
ПУБЛИКУЕТСЯ ВПЕРВЫЕ
Просмотрено
28
Не подходит работа?

Узнай цену на написание


Введение 4
Постановка задачи 6
1. Обзор существующих решений 7
1.1. Инструмент CrossHair 7
1.1.1 Проблема нативных функций 7
1.1.2 Проблема неизвестных типов 8
1.2. Инструмент PyExZ3 10
1.3. Инструмент PySym 10
1.4. Генераторы тестов без символьного исполнения 10
1.4.1 Инструмент Pynguin 10
1.4.2 Инструмент Klara 11
1.4.3 Инструмент Hypothesis 11
2. Описание алгоритма 12
2.1. Выбранный подход 12
2.2. Компоненты универсальной символьной машины 15
2.3. Основной цикл символьного исполнения 15
2.4. Работа с неизвестными типами 16
3. Реализация 19
3.1. Связывание интерпретатора CPython и USVM в одном про­цессе 19
3.2. Модификация интерпретатора CPython 20
3.3. Реализация символьных операций 21
3.4. Система типов 23
3.5. Реализация отложенных ветвлений 25
3.6. Варианты реализаций PyVirtualPathSelector 28
3.6.1 Внутренние очереди 28
3.6.2 Выбор действия внутри операции peek 29
3.6.3 Выбор рейтинга типов 30
3.6.4 Планы на будущее 31
4. Полученные результаты 32
4.1. Соревнование SBFT 2024 32
4.2. Детали проведения наших экспериментов 32
4.3. Сравнение с CrossHair 33
4.4. Сравнение с фаззингом в UTBot Python 34
4.5. Сравнение с Pynguin 34
Заключение 39
Список литературы 40

Тема данной работы возникла в контексте задачи автоматической гене­рации юнит-тестов. Подобные инструменты способствуют улучшению каче­ства программного кода и ускорению процесса тестирования. Автоматически создаваемые тесты позволяют выявлять ошибки и дефекты, обеспечивая бо­лее полное покрытие функциональности программы. Кроме того, они уско­ряют обнаружение проблем при внесении изменений в код, что упрощает процесс рефакторинга. Поэтому разработка подобных инструментов являет­ся важной задачей.
Существуют различные подходы к генерации юнит-тестов. Методы «черного ящика» состоят в том, что анализ тестируемой программы не про­изводится. Есть подходы, когда из анализируемой программы извлекается небольшой набор данных, например, используемые константы. Такие подхо­ды называют методами «серого ящика». Существуют методы «белого ящика», которые состоят в том, что собирается полная информация обо всех операци­ях внутри тестируемой программы. За счет проведения более полного анализа программы возможно достигать большего покрытия.
Один из распространенных методов для генерации тестов — фаззинг. Он заключается в подстановке случайных данных в качестве входа функции, возможно, с использованием эвристик. Это метод «черного» или «серого» ящика. В определенных ситуациях фаззингу сложно пробиться через мно­жество проверок входных данных внутри функции, что приводит к недоста­точному покрытию. В таких случаях более эффективным методом является символьное исполнение, который является методом «белого ящика».
Метод символьного исполнения заключается в реализации интерпрета­тора, оперирующем символьными выражениями, с которыми умеют работать SMT-решатели1. Такой интерпретатор исследует различные пути выполнения программы и формирует ограничения, соответствующие этим путям. Затем SMT-решатель находит конкретные значения, удовлетворяющие собранным ограничениям.
Разработка анализаторов для Python является весьма сложной зада­чей. Это связано с разными аспектами данного языка программирования. Во-первых, в языке Python очень большое количество разных синтаксических конструкций, которые надо учитывать. Во-вторых, значительная часть стан­дартной библиотеки Python — это нативные расширения. К тому же есть много внешних библиотек, которые являются нативными расширениями, на­пример, библиотека numpy.
Главная особенность Python заключается в том, что это динамически типизированный язык. Это представляет большие трудности как для фаззин- га, так и для символьного исполнения. Неудачное определение типов входных данных может привести к быстрому завершению программы. При этом вывод типов в Python является очень сложной задачей сам по себе. В части случаев возможно учитывать информацию из аннотаций типов, однако они использу­ются далеко не во всех проектах на Python, и часто являются неполными и неточными. Существующие инструменты справляются с данной проблемой недостаточно хорошо.
В данной работе был предложен подход, как можно моделировать объ­екты неизвестного типа в символьном виде, а также каким образом приори­тизировать конкретные типы. Основная идея состоит в том, что в символьной машине вводится техника отложенных ветвлений.
Предложенный подход был реализован в рамках символьной машины USVM. Эксперименты показали, что данный подход позволяет генерировать тесты с покрытием строк на 24% больше, чем у лучшего из существующих инструментов символьного исполнения для языка Python. Также добавление техники символьного исполнения в инструмент для генерации юнит-тестов UnitTestBot позволило увеличить покрытие сгенерированных тестов на 8%.
...

Возникли сложности?

Нужна помощь преподавателя?

Помощь в написании работ!


В результате данной работы были успешно выполнены следующие за­дачи:
1. Были проанализированы существующие реализации символьного ис­полнения для языка Python. Их немного, и в лучшей существующей реализации (инструмент CrossHair) имеется ряд проблем. В частности, инструмент CrossHair недостаточно хорошо подбирает типы в тех си­туациях, когда они не указаны в виде аннотаций.
2. Были разработаны подходы для решения проблем символьного исполне­ния, специфичных для языка Python. Для облегчения проблемы большо­го количества инструкций было решено комбинировать символьный ин­терпретатор с конкретным. Для облегчения проблемы нативных функ­ций было решено модифицировать исходный код CPython. Для решения проблемы неизвестных типов был разработан подход с имитирующими объектами и отложенными ветвлениями.
3. Данные подходы были реализованы в рамках машины USVM. Основная часть кода была написана на Kotlin, но также присутствуют модули, написанные на C и на Python.
4. Было проведено сравнение полученного инструмента с существующими аналогами. Во-первых, инструмент UTBot Python с встроенной символь­ной машиной стал участником международного соревнования SBFT 2024, где занял призовое место. Во-вторых, был проведен эксперимент по генерации тестов с помощью различных инструментов для реали­заций алгоритмов. Реализованная в данной работе символьная машина набрала на 24% большее покрытие, чем наиболее полная существующая реализация символьного исполнения для Python — CrossHair.
Реализация доступна в публичном репозитории:
https://github.com/UnitTestBot/usvm/tree/tochilinak/python.


[1] Nidhra Srinivas, Dondeti Jagruthi. Black Box and White Box Testing Techniques - A Literature Review // International Journal of Embedded Systems and Applications (IJESA). — 2012. — Vol. 2, no. 2. — P. 29-50. Algorithms, 12:3, 2016.
[2] Valentin J.M. Manes, HyungSeok Han, Choongwoo Han, Sang Kil Cha, Manuel Egele, Edward J. Schwartz, Maverick Woo. The Art, Science, and Engineering of Fuzzing: A Survey., ACM Computing Surveys, 2019.
[3] A Survey of Symbolic Execution Techniques / Roberto Baldoni, Emilio Coppa, Daniele Cono D’elia et al. // ACM Computing Surveys (CSUR). — 2018. — Vol. 51, no. 3. — P. 1-39.
[4] CrossHair. URL: https://github.com/pschanely/CrossHair
[5] A.M. Bruni, T. Disney, C. Flanagan. A Peer Architecture
for Lightweight Symbolic Execution, 2011. URL: https:
//hoheinzollern.files.wordpress.com/2008/04/seer1.pdf
[6] PyExZ3. URL: https://github.com/thomasjball/PyExZ3
[7] PySym. URL: https://github.com/bannsec/pySym
[8] Pynguin. URL: https://github.com/se2p/pynguin
[9] EvoSuite. URL: https://github.com/EvoSuite/evosuite
[10] G. Jahangirova and V. Terragni, "SBFT Tool Competition 2023 - Java Test Case Generation Track,"2023 IEEE/ACM International Workshop on Search­Based and Fuzz Testing (SBFT), Melbourne, Australia, 2023, pp. 61-64, doi: 10.1109/SBFT59156.2023.00025.
[11] Klara. URL: https://github.com/usagitoneko97/klara
[12] Ограничения Klara. URL: https://klara-py.readthedocs.io/en/ latest/limitation.html
[13] Hypothesis. URL: https://github.com/HypothesisWorks/hypothesis
[14] Hypothesis Ghostwriter. URL: https://hypothesis.readthedocs.io/ en/latest/ghostwriter.html
[15] Альтернативные реализации языка Python. URL: https: //wiki.python.org/moin/PythonImplementations
... всего 32 источника


Работу высылаем на протяжении 30 минут после оплаты.




©2025 Cервис помощи студентам в выполнении работ