Введение 4
1. Цель и постановка задачи 7
2. Обзор 8
2.1. Выбор метода верификации 8
2.2. Требования к инструменту верификации 9
2.3. Выбор верификатора 10
2.4. Инструменты автоматической генерации модели 11
3. Модель системы 13
4. Требования и спецификации к системе 18
5. Верификация и анализ контрпримеров 20
6. Заключение 25
Список литературы 26
Компьютерные программы часто содержат различные ошибки. Еще Эдсгер Вибе Дейкстра говорил, что тестирование не позволяет обнаружить все ошибки. Особенно трудно тестировать параллельные, распределенные и многопоточные программы. Даже в тех случаях, когда функционирование каждой из взаимодействующих параллельных частей системы полностью ясно, человеку тяжело осознать работу параллельной системы целиком. Параллельные системы, на первый взгляд, работающие правильно, могут содержать ошибки, проявляющиеся в очень редких случаях (тупики, гонки [24] и т.д.). Существует множество примеров, когда из-за редко проявляющихся ошибок в сложных системах, прошедших тщательное тестирование, компании понесли огромные потери или пострадали пользователи1 [21].
В современном мире имеется большое количество автоматических систем, например автопилот в самолете или спутник, и критически важна корректная и безотказная работа всех компонентов таких систем. Поэтому на первый план выходят свойства надежности и предсказуемости поведения системы. Таким образом, формальная верификация программного кода, позволяющая существенно повысить качество системы, становится важнейшей областью научных исследований в информатике. Формальной верификацией программы, согласно [21], будем называть приемы и методы формального доказательства (или опровержения) того, что модель программной системы удовлетворяет заданной формальной спецификации (см. рис. 1).
Рис. 1: Общая схема верификации
Уже сейчас верификация является промышленным стандартом в критических областях, связанных как с дорогостоящими проектами, так и с человеческими жизнями [4]. С помощью формальной верификации можно доказать некоторые важные свойства системы, гарантировав отсутствие ошибок определенного типа и правильное функционирование системы. Это происходит за счет того, что верификация позволяет провести исчерпывающую проверку всех возможных вычислений модели системы, обнаруживая редко проявляющиеся ошибки [20], которые очень сложно проверить тестированием. Важно понимать, что проведя формальную верификацию и тестирование, нельзя гарантировать полное отсутствие ошибок в системе. Но при использовании этих методов вместе существенно повышается уровень доверия к системе.
На сегодняшний день для верификации сложных параллельных, многопоточных систем зарекомендовал себя метод проверки модели (model checking) [21]. Это метод проверки того, что данная формальная модель системы удовлетворяет ограничению, поставленному чаще всего в терминах какой-либо темпоральной логики, то есть логики, в которой истинность логических утверждений зависит от времени.
Важной частью автоматических систем являются роботы. Программное обеспечение для них часто относится к классу так называемых реагирующих систем, то есть систем, основная функция которых является поддержанием взаимодействия с окружением, а не преобразование информации. Такие системы могут бесконечно работать, они контролируют окружение, реагируя на внешние события. Вычисления на таких системах задаются бесконечной последовательностью состояний во времени. И именно с помощью формальной верификации возможно проанализировать все возможные вычисления таких систем.
В рамках Межвузовской Проектной Лаборатории Робототехники создают программную часть для контроллера робототехнического конструктора TRIK [13]. На таком контроллере, помимо операционной системы, запущено окружение времени выполнения [16], предоставляющее интерфейс программирования приложений для программирования робота, используя язык C++ с инструментарием Qt2 или скриптовый язык Qt Script3, позволяющее исполнять на роботе скрипты, а также управлять роботом извне. Скриптовый язык упрощает программирование роботов, однако окружение времени выполнения является многопоточной, параллельной программой, что обуславливает высокую сложность обнаружения ошибок. Такие роботы могут использоваться как автоматические системы. И безошибочное функционирование окружения времени выполнения в таких случаях является важной задачей. Отметим, что сама программа, окружение времени выполнения, написана на языке C++ с помощью инструментария Qt.
Таким образом, в нашем случае наиболее подходящим методом для формальной верификации окружения времени выполнения робототехнической системы является метод проверки модели. В классическом виде наиболее трудоемкой частью данного метода является разработка самой модели окружения времени выполнения [21]. Сложность связана с большим размером программы и постоянно возникающей при моделировании проблемой комбинаторного взрыва [23]. Необходимо также описать в терминах темпоральной логики интересующие свойства данной программы. Остальная часть работы, связанная с проверкой свойств на модели, выполняется автоматизировано с помощью соответствующих инструментов верификации.
В данной работе были достигнуты следующие результаты.
• Построена документированная, корректная и адекватная модель верифицируемой системы на языке PROMELA.
• Сформулированы требования на естественном языке и разработаны спецификации к системе на языке LTL на основе ожидаемого поведения исходной системы.
• Проведена верификация с помощью инструмента SPIN, найдены тринадцать ошибок и одно предупреждение.
• В качестве побочного результата при построении модели были найдены шесть недочетов, не связанных с процессом формальной верификации.
Исходный код модели, трассы контрпримеров и комментарии к ним выложены в открытый доступ [10].
Смоделированные компоненты и примитивы инструментария Qt могут быть использованы в других моделях. Модель документирована и может эволюционировать вместе с разработкой исходной программы окружения времени выполнения. Ввиду непредвиденно большого объема работы по анализу контрпримеров, не были доказаны некоторые существенные свойства системы. В качестве возможного продолжения работы существует две идеи:
• продолжить формальное доказательство свойств системы для текущей модели;
• в процессе моделирования большинство системных вызов не были учтены, к примеру, в модели практически полностью игнорируется взаимодействие окружения с драйверами датчиков робота; применение активно развивающегося подхода software model checking видится перспективным для решения этой проблемы.
[1] Bandera: Extracting finite-state models from Java source code / James C Corbett, Matthew B Dwyer, John Hatcliff et al. // Software Engineering, 2000. Proceedings of the 2000 International Conference on / IEEE. — 2000. — P. 439-448.
[2] Holzmann Gerard J. The model checker SPIN // IEEE Transactions on software engineering. — 1997. — Vol. 23, no. 5. — P. 279.
[3] Holzmann Gerard J, H Smith Margaret. Software model checking: extracting verification models from source codef // Software Testing, Verification and Reliability. — 2001. — Vol. 11, no. 2. — P. 65-79.
[4] Johnson Leslie A. DO-178B, Software considerations in airborne systems and equipment certification // Crosstalk, October. — 1998.
[5] LTL-patterns.— 2016. — May.— URL: http://patterns.projects. cis.ksu.edu/documentation/patterns.shtml.
[6] Larsen Kim G, Pettersson Paul, Yi Wang. Model-checking for real-time systems // Fundamentals of computation theory / Springer. — 1995. — P. 62-88.
[7] Nusmv 2: An opensource tool for symbolic model checking / Alessandro Cimatti, Edmund Clarke, Enrico Giunchiglia et al. // Computer Aided Verification / Springer. — 2002. — P. 359-364.
[8] Peng Hong, Tahar Sofiene, Khendek Ferhat. Comparison of SPIN and VIS for protocol verification // International Journal on Software Tools for Technology Transfer. — 2003. — Vol. 4, no. 2. — P. 234-245.
[9] Pnueli Amir. The temporal logic of programs // Foundations of Computer Science, 1977., 18th Annual Symposium on / IEEE.— 1977. — P. 46-57.
[10] Results.— 2016. — May.— URL: https://github.com/Kirill-NiK/ SpinTrikRuntimeModel.
[11] Schlich Bastian, Kowalewski Stefan. Model checking C source code for embedded systems // International journal on software tools for technology transfer. — 2009. — Vol. 11, no. 3. — P. 187-202.
[12] Systems and software verification: model-checking techniques and tools / Beatrice Berard, Michel Bidoit, Alain Finkel et al.— Springer Science & Business Media, 2013.
[13] TRIK. TRIK official site. - 2016.-February. - URL: http://www. trikset.com/.
[14] TRIK. trikRuntime architecture.— 2016.—May.— URL: https:// github.com/trikset/trikRuntime/wiki/Архитектура.
[15] TRIK. trikRuntime running process.— 2016. — May.— URL: https://github.com/trikset/trikRuntime/wiki/ Исnолнение-QtScript-на-роботе.
...