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


Разработка виртуальной машины динамического символьного исполнения для языков программирования Java и Kotlin

Работа №143616

Тип работы

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

Предмет

математика и информатика

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

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


Введение 4
Постановка задачи 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, расширяющую уже реализованную подсистему символьного исполнения подсистемой конкретного исполнения с целью уменьшения количества ложных срабатываний и увеличения покрытия кода. Виртуальная машина (движок) реализует подход, который объединяет оба подхода, чтобы повысить эффективность и надежность анализа кода. Такая комбинация позволяет выполнять программу символьно и конкретно, уменьшая неточности чистого символьного исполнения и повышая качество анализа и покрытие анализируемой программы. Все это делает анализ более практичным и применимым для тестирования и анализа программного обеспечения.
Этот диплом описывает дизайн и реализацию виртуальной машины, включая архитектуру конкретного движка, структуры данных и алгоритмы. Также представлены экспериментальные результаты, которые позволяют дальнейший анализ эффективности виртуальной машины в обнаружении дефектов и уязвимостей в реальных программах.
Более того, подсистема конкретного исполнения, представленная в данном дипломе, интегрирована в инструмент 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, где занял второе место, показав хорошие результаты работы на реальных проектах.



[1] Shaukat Ali и др. “A systematic review of the application and empirical investigation of search-based test case generation”. В: IEEE Transactions on Software Engineering 36.6 (2009), с. 742—762.
[2] Saswat Anand и др. “Automated concolic testing of smartphone apps”. В: Proceedings of the ACM SIGSOFT 20th International Symposium on the Foundations of Software Engineering. 2012, с. 1—11.
[3] Ricardo Anido и др. “Test suite minimization for testing in context”. В: Software Testing, Verification and Reliability 13.3 (2003), с. 141—155.
[4] Roberto Baldoni и др. A Survey of Symbolic Execution Techniques. 2018. arXiv: 1610.00502 [cs.SE].
[5] Clark Barrett и др. “CVC4”. В: Computer Aided Verification. Под ред. Ganesh Gopalakrishnan и Shaz Qadeer. Berlin, Heidelberg: Springer Berlin Heidelberg, 2011, с. 171—177. ISBN: 978-3-642-22110-1.
[6] Pietro Braione и др. “Combining symbolic execution and search-based testing for programs with complex heap inputs”. В: Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis. 2017, с. 90—101.
[7] Cristian Cadar и Koushik Sen. “Symbolic Execution for Software Testing: Three Decades Later”. В: Commun. ACM 56.2 (февр. 2013), с. 82—90. ISSN: 0001-0782. DOI: 10.1145/2408776.2408795. URL: https://doi.org/ 10.1145/2408776.2408795.
[8] Ting Chen и др. “State of the art: Dynamic symbolic execution for automated test generation”. В: Future Generation Computer Systems 29.7 (2013), с. 1758—1773.
[9] Kivanc Doganay и др. Search-based testing for embedded telecommunication software with complex input structures: An industrial case study. 2014.
[10] Niklas Een и Niklas Sorensson. “An Extensible SAT-solver”. В: International Conference on Theory and Applications of Satisfiability Testing. 2003.
[11] Juan Pablo Galeotti, Gordon Fraser и Andrea Arcuri. “Improving searchbased test suite generation with dynamic symbolic execution”. В: 2013 ieee 24th international symposium on software reliability engineering (issre). IEEE. 2013, с. 360—369.
[12] Patrice Godefroid, Nils Klarlund и Koushik Sen. “DART: Directed automated random testing”. В: Proceedings of the 2005 ACM SIGPLAN conference on Programming language design and implementation. 2005, с. 213—223.
[13] Patrice Godefroid, Michael Y Levin, David A Molnar и др. “Automated whitebox fuzz testing.” В: NDSS. Т. 8. 2008, с. 151—166.
[14] Eugene Goldberg и Yakov Novikov. “BerkMin: A fast and robust Sat-solver”. В: Discrete Applied Mathematics 155.12 (2007). SAT 2001, the Fourth International Symposium on the Theory and Applications of Satisfiability Testing, с. 1549—1561. ISSN: 0166-218X. DOI: https://doi.org/10.1016/ j. dam. 2006.10.007. URL: https: / / www. sciencedirect. com / science / article/pii/S0166218X06004616.
[15] Kasper Luckow и др. “JD art: a dynamic symbolic analysis framework”. В: Tools and Algorithms for the Construction and Analysis of Systems: 22nd International Conference, TACAS 2016, Held as Part of the European Joint Conferences on Theory and Practice of Software, ETAPS 2016, Eindhoven, The Netherlands, April 2-8, 2016, Proceedings 22. Springer. 2016, с. 442— 459...20


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



Подобные работы


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