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