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


Проектирование и разработка универсальной символьной виртуальной машины

Работа №126722

Тип работы

Бакалаврская работа

Предмет

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

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

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


Введение 4
Постановка задачи 6
1. Обзор предметной области 7
1.1. SMT-решатели 7
1.2. Символьное исполнение 9
1.3. Общее устройство символьной машины 11
1.4. Общие проблемы в символьном исполнении 12
1.5. Существующие символьные машины 15
2. Описание символьной виртуальной машины 17
2.1. Основные решения 17
2.2. Архитектура 18
2.3. Представление выражений 21
2.3.1 Библиотека KSMT 21
2.3.2 Представление примитивных значений 22
2.3.3 Представление ссылочных значений 23
2.3.4 Представление массивов 24
2.3.5 Представление символьных выражений программы 24
2.4. Символьное состояние 27
2.5. Символьная память 28
2.5.1 Регистровый стек 31
2.5.2 Хранилище типов 32
2.6. Символьная куча 32
2.6.1 URegionHeap и регионы памяти 34
2.6.2 Дерево регионов 38
2.6.3 Разделение символьных и конкретных адресов 44
2.7. Модель 48
2.7.1 Композиция 49
2.8. Решатель ограничений 53
2.8.1 Транслятор и декодер 53
2.8.2 Решатель типовых ограничений 54
2.9. Интерпретатор 56
2.10. Очередь состояний 57
2.11. Дополнительные детали 58
2.11.1 Список типов для объекта 58
2.11.2 Операции группового копирования 58
2.11.3 Моделирование библиотеки 59
2.11.4 Регионы типов 59
3. Полученные результаты 60
3.1. Практическое применение 60
3.1.1 Тестовый язык программирования 60
3.1.2 Java 61
3.2. Замеры производительности 62
3.2.1 Скорость работы кучи 62
3.2.2 Сравнение с UTBotJava 64
3.3. Дальнейший планы 66
Заключение 67
Благодарность 68
Список литературы 69

Количество инструментов для анализа кода, помогающих в цикле раз­работки и поддержки программного обеспечения, постоянно растёт. Область их применения действительно широка: поиск ошибок в процессе написания кода; валидация кода на соответствие стилю, принятому в команде; автомати­ческая генерация регрессионных тестов; автоматическое нахождение ошибок и уязвимостей; автоматическая проверка инвариантов программ; помощь в написании программ с заданными свойствами; поиск деградаций производи­тельности; генерация описаний функции и многое другое.
Одним из наиболее эффективных и точных подходов в анализе про­грамм является так называемое символьное исполнение. Анализаторы, осно­ванные на символьном исполнении, используются в системах непрерывной сборки в крупных компаниях, таких как Microsoft. Например, инструмент SAGE, использующий символьное исполнение, помог найти критическую ошибку в исходном коде операционной системы Windows [1]. Символьное исполнение активно используется для генерации модульных тестов, позволяя существенно повысить качество кода и сэкономить время разработчиков и тестировщиков.
Идея, лежащая в основе символьного исполнения, заключается в иссле­довании программы путём перебора различных путей исполнении и проверке предикатов, определяющих очередной путь. При этом конкретные входные значения программы заменяются на символьные, таким образом получается исчерпывающее описание условия ошибки, выраженное с помощью предика­тов на входные значения.
Одним из преимуществ символьного исполнения по сравнению с други­ми техниками является теоретическая доказуемость. Иначе говоря, с помо­щью символьного исполнения можно проверять некоторые свойства анализи­руемой программы. К основным недостаткам символьного исполнения можно отнести высокую вычислительную сложность, связанную с необходимостью исследования большого количества состояний программы. К тому же задача проверки выполнимости формулы в теории SMT1, на которой основан лю­бой алгоритм символьного исполнения, является NP-трудной2, и её решение может занимать длительное время.
Впервые идея символьного исполнения была представлена в статье 1976 года [2], однако наиболее активно развиваться и применяться символьные ма­шины начали только в конце XX-начале XXI века. Например, для языков, ком­пилирующихся в LLVM [3], появилась символьная машина KLEE [4], широко распространённая в индустрии и объединяющая большое количество иссле­дователей из академической среды. С другой стороны, для многих языков всё ещё не существует решения, удовлетворяющего ограничениям по точности и прежде всего масштабируемости.
Дополнительно стоит отметить, что многие символьные машины реа­лизуют похожие сущности, имеют общую архитектуру и решают одинаковые проблемы, независимо от анализируемого языка. Таким образом, возникает потребность в эффективной реализации ядра символьной машины, подходя­щего для различных целей. Идея данной работы заключается в выделении, проектировании и реализации некоторого набора компонентов, позволяюще­го реализовать эффективный символьную машину для любого целевого языка с автоматическим управлением памятью, такого как Java, Go, Python и т.д. Данное ограничение является довольно существенным, однако оно позво­ляет существенно оптимизировать представление памяти будущего ядра, к тому же согласно индексам популярности языков программирования TIOBE [5] и PYPL [6], языки с автоматическим управлением памятью составляют большую часть на рынке.
Постановка задачи
Целью данной работы является создание ядра универсальной символь­ной виртуальной машины, подходящей для анализа языков программирова­ния с автоматическим управлением памятью.
Для достижения поставленной цели были выделены следующие задачи:
• Анализ существующих символьных машин и различных техник в сим­вольном исполнении.
• Проектирование и разработка основных компонентов универсальной символьной виртуальной машины, подходящей для анализа языков с автоматическим управлением памятью.
• Реализация с использованием полученной машины анализатора для языков, компилирующихся в JVM байт-код, поддерживающего основ­ной набор инструкций.
• Замеры производительности полученного анализатора и сравнение с одним из существующих анализаторов для языка Java.

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

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

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


В результате данной работы были успешно выполнены следующие за­дачи:
• Был проведён анализ существующих машин и наиболее часто встреча­ющихся подходов в символьном исполнении.
• Реализовано ядро универсальной символьной виртуальной машины.
• С использованием данного ядра был разработан анализатор для искус­ственного языка программирования, а также для языка, компилирую­щегося в байт-код JVM.
• Были проведены замеры производительности на синтетических данных, а также проведено сравнение полученных результатов с машиной сим­вольного исполнения UTBotJava.
Таким образом, была подтверждена возможность использования уни­версального символьного ядра для написания анализов для разных языков. Полученное ядро ^SVM может существенно сократить время, потраченное на разработку символьного анализатора для произвольного языка с автоматиче­ским управлением памятью. Отдельно стоит отметить, что часть полученных решений до этого не применялась ни в одной известной автору символьной машине и представляет собой перспективный задел для дальнейших иссле­дований.
Всю реализацию универсальной символьной виртуальной машины и ана­лизатора для языка Java можно найти по ссылке: https://github.com/UnitTestBot/usvm.


[1] Patrice Godefroid, Michael Y. Levin, and David Molnar. Sage: Whitebox fuzzing for security testing: Sage has had a remarkable impact at microsoft. Queue, 10(1):20-27, jan 2012.
[2] James King. Symbolic execution and program testing. Commun. ACM, 19:385-394, 07 1976.
[3] Chris Lattner and Vikram Adve. LLVM: A compilation framework for lifelong program analysis and transformation. pages 75- 86, 04 2004.
[4] Cristian Cadar, Daniel Dunbar, and Dawson Engler. Klee: Unassisted and automatic generation of high-coverage tests for complex systems programs. volume 8, pages 209-224, 01 2008.
[5] The TIOBE programming community index. https://www.tiobe.com/ tiobe-index/. Дата обр. 2023-05-24.
[6] The PYPL popularity of programming language index. https:// pypl.github.io/PYPL.html. Дата обр. 2023-05-24.
[7] Stephen A. Cook. The complexity of theorem-proving procedures. In Proceedings of the Third Annual ACM Symposium on Theory of Computing, STOC ’71, page 151-158, New York, NY, USA, 1971. Association for Computing Machinery.
[8] Aaron Stump, Clark Barrett, and David Dill. A decision procedure for an extensional theory of arrays. 01 2002.
[9] Clark W. Barrett, David L. Dill, and Jeremy R. Levitt. A decision procedure for bit-vector arithmetic. In Proceedings of the 35th Annual Design Automation Conference, DAC ’98, page 522-527, New York, NY, USA, 1998. Association for Computing Machinery.
[10] Tjark Weber, Sylvain Conchon, David Deharbe, Matthias Heizmann, Aina Niemetz, and Giles Reger. The SMT competition 2015-2018. J. Satisf. Boolean Model. Comput., 11(1):221-259, 2019.
[11] C Barrett, P Fontaine, and C Tinelli. The smt-lib standard: Version 2.6, 2017. Available: www. SMT-LIB. org.
[12] Leonardo de Moura and Nikolaj Bj0rner. Z3: an efficient smt solver. volume 4963, pages 337-340, 04 2008.
[13] Haniel Barbosa, Clark W. Barrett, Martin Brain, Gereon Kremer, Hanna Lachnitt, Makai Mann, Abdalrhman Mohamed, Mudathir Mohamed, Aina Niemetz, Andres Notzli, Alex Ozdemir, Mathias Preiner, Andrew Reynolds, Ying Sheng, Cesare Tinelli, and Yoni Zohar. cvc5: A versatile and industrial­strength SMT solver. In Dana Fisman and Grigore Rosu, editors, Tools and Algorithms for the Construction and Analysis of Systems - 28th International Conference, TACAS 2022, Held as Part of the European Joint Conferences on Theory and Practice of Software, ETAPS 2022, Munich, Germany, April 2-7, 2022, Proceedings, Part I, volume 13243 of Lecture Notes in Computer Science, pages 415-442. Springer, 2022.
[14] Bruno Dutertre and Leonardo de Moura. The yices smt solver. 01 2006.
[15] Aina Niemetz and Mathias Preiner. Bitwuzla at the smt-comp 2020. arXiv preprint arXiv:2006.01621, 2020.
...


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



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


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