Формальная верификация

Формальная верификация (англ. formal verification) — это процесс доказательства или опровержения корректности аппаратного или программного комплекса по отношению к определённой формальной спецификации или свойству с использованием формальных методов математики[1]. Формальная верификация выступает ключевым стимулом для формальной спецификации систем и лежит в основе формальных методов. Она является важнейшей составляющей анализа и верификации в области автоматизированного проектирования электронных систем (EDA) и представляет собой один из способов верификации программного обеспечения. Применение формальной верификации даёт возможность достичь самого высокого уровня оценки доверия — EAL7 в рамках сертификации общие критерии информационной безопасности компьютерных систем[2].

Описание

Формальная верификация может применяться для доказательства корректности таких систем, как криптографические протоколы, комбинационные схемы, цифровые устройства с внутренней памятью, а также программное обеспечение, представленное в виде исходного кода на одном из языков программирования. К известным примерам верифицированных программных систем относятся CompCert — проверенный компилятор языка C и микрокернель операционной системы высокого доверия seL4.

Верификация этих систем проводится путём доказательства существования формального доказательства математической модели исследуемого объекта[3]. В качестве математических объектов для моделирования систем используются: конечные автоматы, отмеченные системы переходов, клаузулы Хорна, сети Петри, системы сложения векторов, тайм-автоматы, гибридные автоматы, алгебра процессов, формальные семантики языков программирования, такие как операционная семантика, денотационная семантика, аксиоматическая семантика и логика Хора[4].

Подходы

Модельное проверение

Модельное проверение заключается в систематическом и полном исследовании математической модели системы. Такой анализ возможен для конечных моделей, а также для некоторых видов бесконечных моделей, если удаётся эффективно задать бесконечные множества состояний путём абстрагирования или использования симметрии. Обычно процедура сводится к перебору всех состояний и переходов в модели, где для ускорения расчётов применяют специальные предметно-ориентированные методы абстрагирования, позволяющие рассматривать целые группы состояний единой операцией. К числу техник реализации относятся: перебор пространства состояний, символьный перебор пространства состояний, абстрактная интерпретация, символическое моделирование, уточнение абстракций. Свойства, подлежащие проверке, часто описываются при помощи темпоральных логик, например, линейная темпоральная логика (LTL), Property Specification Language (PSL), SystemVerilog Assertions (SVA)[5], или компьютерная древовидная логика (CTL). Главным преимуществом модельного проверения считается высокая степень автоматизации; основной недостаток — трудности масштабирования на крупные системы: символьные модели обычно ограничиваются несколькими сотнями бит состояния, тогда как явный перебор требует сравнительно небольшого размера пространства состояний.

Дедуктивная верификация

Другим подходом является дедуктивная верификация[6][7]. Она включает в себя построение по системе и её спецификации (а иногда и по дополнительным аннотациям) набора математических «обязательств к доказательству» (proof obligations), истинность которых гарантирует соответствие системы спецификации, а затем — доказательство этих обязательств с помощью помощников доказательств (интерактивных проверяющих теорем), таких как HOL, ACL2, Isabelle, Rocq (ранее известный как Coq), PVS, либо при помощи автоматических доказателей теорем, в частности решателей задачи выполнимости по теориям (SMT). Недостатком этого способа является то, что от пользователя может потребоваться глубокое понимание причин корректности системы и уточнение этой информации для инструмента проверки — в виде последовательности теорем для доказательства или посредством формализации спецификаций (инвариантов, предусловий, постусловий) для компонентов и, возможно, их подкомпонентов.

Применение к программному обеспечению

Формальная верификация программ заключается в доказательстве того, что программа удовлетворяет формальной спецификации её поведения. К направлениям формальной верификации относятся дедуктивная верификация, абстрактная интерпретация, автоматическое доказательство теорем, типовые системы, а также облегчённые формальные методы. Одним из перспективных подходов, основанных на типах, выступает программирование с зависимыми типами, при котором типы функций (частично или полностью) включают формальные спецификации, а успешная проверка типов эквивалентна доказательству корректности реализованного кода относительно спецификаций. Полноценные языки с поддержкой зависимых типов позволяют воспринимать дедуктивную верификацию как частный случай проверки типов.

Другим дополнительным подходом является выведение программ, когда эффективный код строится по функциональной спецификации через последовательность преобразований, сохраняющих корректность. Примером такого подхода служит формализм Бёрд—Мертенс, рассматриваемый также как одна из форм синтеза программ.

Перечисленные методы могут быть «корректными», то есть гарантировать логическое следование свойств программы из её семантики, или «некорректными», когда такой гарантии нет. Корректная методика возвращает результат только после анализа всего пространства возможностей; пример некорректной — покрывающей лишь их подмножество, например, только целые числа в определённом диапазоне, чаще всего выносящей «достаточно хороший» ответ. Техники могут также быть «разрешимыми» — их алгоритмы гарантированно завершаются выдачей результата, или неразрешимыми, когда вычисления теоретически могут идти бесконечно. При ограничении области рассмотрения возможна реализация некорректной, но разрешимой методики, если корректная разрешимость недостижима.

Верификация и валидация

Верификация — это одна из сторон процесса проверки пригодности продукта к использованию; валидация — её дополнение. Всё вместе этот процесс называют V & V (Verification and Validation).

  • Валидация: «Правильный ли продукт мы пытаемся создать?» — то есть, соответствует ли продукт реальным потребностям пользователя?
  • Верификация: «Создали ли мы то, что планировали?» — то есть, соответствует ли продукт заявленным спецификациям?

Верификация может включать как статические / структурные, так и динамические / поведенческие аспекты. Например, для ПО можно проанализировать исходный код (статический аспект) или выполнить тесты по определённым сценариям (динамический аспект). Валидация, напротив, обычно возможна только динамически, то есть путём проверки, как продукт ведёт себя при типичных и нетипичных вариантах использования («Полностью ли удовлетворяет известным сценариям?»).

Автоматический ремонт программ

Ремонт программ осуществляется относительно оракула, задающего желаемую функциональность программы, который используется для валидации исправления. Простейший пример — это тестовый набор: пары вход—выход определяют корректное поведение программы. На практике применяются различные методы, например, с использованием SMT-решателей (решателей задачи выполнимости по теориям) и генетическое программирование[8], когда возможные варианты исправлений генерируются и оцениваются с помощью методов эволюционного вычисления. Первый метод — детерминированный, второй — вероятностный.

Ремонт программ сочетает методы формальной верификации с синтезом программ. Для определения потенциальных локаций ошибок применяются техники локализации дефектов, используемые в формальной верификации, на которые затем нацеливаются модули синтеза. Системы ремонта обычно концентрируются на узких классах типов ошибок с целью уменьшения области поиска вариантов исправлений. Применение в промышленности ограничено из-за высокой вычислительной стоимости существующих методов.

Использование в промышленности

Рост сложности проектируемых систем делает формальные методы анализа всё более востребованными в аппаратной сфере[9][10]. В настоящее время формальная верификация используется большинством ведущих производителей аппаратного обеспечения[11], тогда как в разработке программного обеспечения распространение этих методов остаётся низким. Это объясняется большей востребованностью формальных методов именно в аппаратной сфере, где ошибки часто приводят к ощутимым экономическим потерям. Кроме того, из-за возможности сложных взаимодействий между компонентами становится всё труднее охватить все сценарии поведения исключительно методом симуляции, тогда как многие задачи аппаратного проектирования формализуемы и поддаются автоматическим доказательствам, благодаря чему внедрение формальной верификации для аппаратных решений проще и эффективнее[12].

По состоянию на 2011 год были формально верифицированы несколько операционных систем: Secure Embedded L4 microkernel, созданный NICTA (и реализуемый коммерчески как seL4 компанией OK Labs)[13], ОС реального времени ORIENTAIS, созданная на базе OSEK/VDX в Восточно-Китайском педагогическом университете, Integrity от Green Hills Software, а также PikeOS от SYSGO[14].[15] В 2016 году команда под руководством Чжуна Шао в Йельском университете разработала формально верифицированный микроядро CertiKOS[16].[17]

По состоянию на 2017 год формальная верификация применяется при проектировании масштабных компьютерных сетей на основе строгого математического моделирования[18], а также в рамках нового класса технологий — сетей на основе намерений[19]. Крупные разработчики сетевого ПО, предлагающие решения формальной верификации, включают Cisco[20], Forward Networks[21][22] и Veriflow Systems[23].

Язык программирования SPARK содержит инструменты, позволяющие вести разработку с формальной верификацией, и используется в ряде ответственных промышленных систем.

Компилятор CompCert реализует большую часть стандарта ISO C и формально верифицирован как корректный[24][25].

Примечания

  1. Sanghavi, Alok (21 мая 2010). “What is formal verification?”. EE Times Asia [англ.]. Дата обращения 2024-06-10. |access-date= требует |url= (справка)
  2. Common Criteria for Information Technology Security Evaluation Part 5: Pre-defined packages of security requirements (англ.). Дата обращения: 15 апреля 2025.
  3. Sanjit A. Seshia. Chapter 3: Modeling for Verification // Handbook of Model Checking : [англ.] / Sanjit A. Seshia, Natasha Sharygina, Stavros Tripakis. — Springer, 2018. — P. 75–105. — ISBN 978-3-319-10574-1. — doi:10.1007/978-3-319-10575-8.
  4. Introduction to Formal Verification (англ.). Berkeley University of California. Дата обращения: 6 ноября 2013.
  5. Cohen, Ben. SystemVerilog Assertions Handbook / Ben Cohen, Srinivasan Venkataramanan, Ajeetha Kumari … [и др.]. — 4th. — CreateSpace Independent Publishing Platform, 2015. — ISBN 978-1518681448.
  6. Deductive Software Verification - The KeY Book: From Theory to Practice : [англ.]. — 1st 2016. — Cham : Springer International Publishing : Imprint: Springer, 2016. — ISBN 978-3-319-49812-6.
  7. Building Deductive Program Verifiers - Lecture Notes // Engineering secure and dependable software systems : [англ.]. — Amsterdam, Netherlands : IOS Press, 2019. — ISBN 978-1-61499-976-8.
  8. Le Goues, Claire; Nguyen, ThanhVu; Forrest, Stephanie; Weimer, Westley (январь 2012). “GenProg: A Generic Method for Automatic Software Repair”. IEEE Transactions on Software Engineering [англ.]. 38 (1): 54—72. DOI:10.1109/TSE.2011.104. S2CID 4111307. Дата обращения 2024-06-10. Проверьте дату в |date= (справка на английском)
  9. Harrison, J. Formal verification at Intel // 18th Annual IEEE Symposium of Logic in Computer Science, 2003. Proceedings : [англ.]. — 2003. — P. 45–54. — ISBN 978-0-7695-1884-8. — doi:10.1109/LICS.2003.1210044.
  10. Formal verification of a real-time hardware design (англ.). ACM Portal. Дата обращения: 30 апреля 2011.
  11. Formal Verification: An Essential Tool for Modern VLSI Design by Erik Seligman, Tom Schubert, and M V Achutha Kirankumar (англ.) (2015). Дата обращения: 10 июня 2024.
  12. Formal Verification in Industry (англ.). Дата обращения: 20 сентября 2012.
  13. Abstract Formal Specification of the seL4/ARMv6 API (англ.). Дата обращения: 19 мая 2015. Архивировано 21 мая 2015 года.
  14. Ingredients of Operating System Correctness? Lessons Learned in the Formal Verification of PikeOS (англ.). Дата обращения: 19 июля 2011. Архивировано 19 июля 2011 года.
  15. Ganssle, Jack Getting it Right (англ.). ganssle.com. Дата обращения: 10 июня 2024.
  16. Harris, Robin Unhackable OS? CertiKOS enables creation of secure system kernels (англ.). ZDNet. Дата обращения: 10 июня 2019.
  17. CertiKOS: Yale develops world's first hacker-resistant operating system (англ.). International Business Times UK (15 ноября 2016). Дата обращения: 10 июня 2019.
  18. Scroxton, Alex For Cisco, intent-based networking heralds future tech demands (англ.). Computer Weekly. Дата обращения: 12 февраля 2018.
  19. Lerner, Andrew Intent-based networking (англ.). Gartner. Дата обращения: 12 февраля 2018.
  20. Kerravala, Zeus Cisco brings intent based networks to the data center (англ.). NetworkWorld. Дата обращения: 12 февраля 2018. Архивировано 11 декабря 2023 года.
  21. Forward Networks: Accelerating and De-risking Network Operations (англ.). Insightssuccess Media and Technology Pvt. Ltd.. Insights Success (16 января 2018). Дата обращения: 12 февраля 2018.
  22. Getting Grounded in Intent=based Networking (англ.). NetworkWorld. Дата обращения: 12 февраля 2018.
  23. Veriflow Systems (англ.). Bloomberg. Дата обращения: 12 февраля 2018.
  24. CompCert - The CompCert C compiler (англ.). compcert.org. Дата обращения: 22 февраля 2023.
  25. Barrière, Aurèle; Blazy, Sandrine; Pichardie, David (9 января 2023). “Formally Verified Native Code Generation in an Effectful JIT: Turning the CompCert Backend into a Formally Verified JIT Compiler”. Proceedings of the ACM on Programming Languages [англ.]. 7 (POPL): 249—277. arXiv:2212.03129. DOI:10.1145/3571202. ISSN 2475-1421. S2CID 253736486.