Введение 3
Постановка задачи 5
1. Обзорный раздел по предметной области 6
1.1. Абстрактная интерпретация 6
1.2. Реляционные и нереляционные домены 9
1.3. Существующие реляционные числовые домены 10
1.3.1 Домен, выражающий равенства 10
1.3.2 Polyhedra 10
1.3.3 Октогональный домен 11
1.4. Вывод инвариантов циклов и свойств элементов массивов . 12
2. Добавление поддержки реляционных доменов в движок 18
2.1. Схема работы движка с реляционными доменами 18
2.2. Чувствительность к путям исполнения 20
2.3. Реляционные домены и интерпроцедурность 22
3. Реализация октогонального домена 23
3.1. Абстрактный октогональный домен 23
3.2. Работа с целыми и нецелыми числами в октогональном домене 24
3.3. Учет целочисленности в строгих неравенствах 25
4. Реализация вывода инвариантов, касающихся элементов мас
сивов 27
4.1. Общее устройство домена для вывода инвариантов 27
4.2. Динамическое разбиение на подпространства 28
4.3. Выбор ограничений, хранимых для подпространств 31
4.4. Оптимизации оператора объединения 31
5. Тестирование движка с реляционными доменами 33
5.1. Проведенные тесты и их результаты 33
5.2. Сравнение с возможностями аналогичных движков 36
Заключение 37
Список литературы 38
В современном мире непрерывно увеличивается количество окружающих нас компьютерных программ. Вместе с ним неизбежно увеличивается и количество всевозможных уязвимостей и дефектов в этих программах. Ошибки в программном обеспечении приводят к плачевным последствиям — некорректной работе программ, утечкам данных разработчиков и/или пользователей, а иногда — к крупным экономическим и даже человеческим потерям. Так, проблемы в ПО стали причиной двух крушений самолетов Boeing 737 MAX в 2018 и 2019 годах.
Высокая доля потенциальных ошибок в программах выявляется компилятором или интерпретатором и выдается ими в качестве ошибок или предупреждений. Однако таким образом могут быть выявлены только наиболее стандартные и примитивные ошибки. Другим способом поиска дефектов является тестирование — ручное и автоматическое, которое позволяет проверить корректность работы ПО в сценариях различной сложности. Существенным недостатком этого метода является человеческий фактор: во- первых, разработка и проведение тестов требуют большого количества человекочасов, во-вторых, ошибки можно допустить и при составлении тестов, наконец, зачастую даже самое тщательное тестирование не способно покрыть все возможные сценарии работы программы.
В силу недостаточности приведенных методов поиска дефектов все большее развитие получают статические анализаторы — специальные программы для автоматического поиска уязвимостей в коде, которые не требуют непосредственно запуска этого кода. Статические анализаторы позволяют без помощи человека находить проблемы в коде, которые не под силу найти компиляторам. Одной из наиболее классических и развитых техник статического анализа является абстрактная интерпретация, предложенная еще в 1977 году.
Суть этой техники состоит в том, чтобы научиться представлять конкретные состояния программы (содержимого ее переменных, стека вызовов и пр.) в каждый момент времени исполнения в виде элементов некоторого абстрактного домена, и свести моделирование исполнения программы к выполнению ее инструкций над этим абстрактным состоянием. Тогда, анализируя достижимые абстрактные состояния, можно определить достижимость конкретных ошибочных состояний программы.
Ключевым фактором, определяющим точность абстрактной интерпретации, является выбранный абстрактный домен, отвечающий за хранение информации о состоянии переменных программы. Данная работа посвящена разработке и внедрению в промышленный движок абстрактной интерпретации доменов, способных выводить и использовать в анализе сложные свойства программ: неравенства, связывающие значения различных числовых переменных, а также свойства элементов массивов, выполненные на всех итерациях циклов — инварианты циклов.
В ходе данной работы в движок для абстрактной интерпретации была добавлена возможность расширения его произвольными реляционными доменами. Был реализован октогональный домен для числовых переменных. Также на основе имеющихся работ в этой области был придуман, разработан и внедрен домен, позволяющий выводить инварианты циклов и свойства элементов массивов.
Оба реализованных расширения были протестированы как на искусственных тестовых примерах, так и на реальных больших проектах. В результате оба домена продемонстрировали свою корректность и повышение точности статического анализа при их использовании. При этом октогональ- ный домен практически не оказывает влияния на скорость работы движка, а вывод инвариантов в подавляющем большинстве случаев приводит к разумному замедлению движка не более чем в несколько раз.
Оба домена оказались способны произвести точный анализ кода во многих примерах, с которыми не справились популярные находящиеся в открытом доступе аналоги.
[1] G. Travis, “How the Boeing 737 Max Disaster Looks to a Software Developer.” https://spectrum.ieee.org/how-the-boeing- 737-max-disaster-looks-to-a-software-developer, 2019. (дата обр. 09.05.2024).
[2] P. Cousot and R. Cousot, “Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints,” in Proceedings of the 4th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages, POPL ’77, (New York, NY, USA), p. 238-252, Association for Computing Machinery, 1977.
[3] S. Diehl, P. Hartel, and P. Sestoft, “Abstract machines for programming language implementation,” Future Generation Computer Systems, vol. 16, no. 7, pp. 739-751, 2000.
[4] D. Van Horn and M. Might, “Abstracting abstract machines,” SIGPLAN Not., vol. 45, p. 51-62, sep 2010.
[5] P. Cousot and N. Halbwachs, “Automatic discovery of linear restraints among variables of a program,” in Proceedings of the 5th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages, POPL ’78, (New York, NY, USA), p. 84-96, Association for Computing Machinery, 1978.
[6] A. Mine, “The Octagon Abstract Domain,” Higher-Order and Symbolic Computation, vol. 19, pp. 31-100, 2006.
[7] C. A. Furia, B. Meyer, and S. Velder, “Loop invariants: Analysis, classification, and examples,” ACM Comput. Surv., vol. 46, jan 2014.
[8] M. D. Ernst, A. Czeisler, W. G. Griswold, and D. Notkin, “Quickly detecting relevant program invariants,” in Proceedings of the 22nd International Conference on Software Engineering, ICSE ’00, (New York, NY, USA), p. 449-458, Association for Computing Machinery, 2000.
[9] T. Henzinger, T. Hottelier, L. Kovacs, and A. Rybalchenko, “Aligators for arrays (tool paper),” pp. 348-356, 10 2010.
[10] D. Larraz, E. Rodriguez-Carbonell, and A. Rubio, “Smt-based array invariant generation,” in Verification, Model Checking, and Abstract Interpretation (R. Giacobazzi, J. Berdine, and I. Mastroeni, eds.), (Berlin, Heidelberg), pp. 169-188, Springer Berlin Heidelberg, 2013.
[11] D. Gopan, T. Reps, and M. Sagiv, “A framework for numeric analysis of array operations,” in Proceedings of the 32nd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, POPL ’05, (New York, NY, USA), p. 338-350, Association for Computing Machinery, 2005.
[12] N. Halbwachs and M. Peron, “Discovering properties about arrays in simple programs,” in Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation, PLDI ’08, (New York, NY, USA), p. 339-348, Association for Computing Machinery, 2008.
[13] V. Kashyap, K. Dewey, E. Kuefner, J. Wagner, K. Gibbons, J. Sarracino, B. Wiedermann, and B. Hardekopf, “Jsai: Designing a sound, configurable, and efficient static analyzer for javascript,” 03 2014.
[14] MDN, “Addition (+).” https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Operators/Addition#description. (дата обр. 13.05.2024).
[15] R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella, “Widening operators for weakly-relational numeric abstractions,” in Static Analysis (C. Hankin and I. Siveroni, eds.), (Berlin, Heidelberg), pp. 3-18, Springer Berlin Heidelberg, 2005.
... всего 22 источника