что такое верификация в программировании

Создание системы формальной верификации с нуля. Часть 1: символьная виртуальная машина на PHP и Python

Формальная верификация — это проверка одной программы либо алгоритма с помощью другой.

Это один из самых мощных методов, который позволяет найти в программе все уязвимости либо же доказать, что их нет.

Более подробное описание формальной верификации можно увидеть на примере решения задачи о Волке, Козе, и капусте в моей предыдущей статье.

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

Для этого я написал свой аналог виртуальной машины, на символьных принципах.

Она разбирает код программы и транслирует его в систему уравнений (SMT), которую уже можно решить программным способом.

Так как информация о символьных вычислениях представлена в интернете довольно обрывочно,
я вкратце опишу что это такое.

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

Например, мы можем задать входные условия где первый аргумент может принимать любые положительные значения, второй отрицательные, третий — ноль, а выходной аргумент, к примеру, 42.

Символьные вычисления за один запуск дадут нам ответ, возможно ли получение нами нужного результата и пример набора таких входных параметров. Либо же доказательство того, что таких параметров нет.

Более того, мы можем задать входные аргументы вообще как все возможные, и выберем только выходной, например пароль администратора.

В этом случае мы найдём все уязвимости программы или же получим доказательство того, что пароль админа в безопасности.

Можно заметить, что классическое выполнение программы с конкретными входными данными представляет собой частный случай символьного.

Поэтому моя символьная VM может работать и в режиме эмуляции стандартной виртуальной машины.

В комментариях к предыдущей статье можно найти и справедливую критику формальной верификации с обсуждением её слабых мест.

Основные проблемы следующие:

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

Поскольку смарт-контракты подходят под эти требования наилучшим образом, выбор пал на контракты RIDE от платформы Waves: они не являются Тьюринг-полными, и их максимальная сложность искусственно ограничена.

Но мы будем рассматривать их исключительно с технической стороны.

В дополнение ко всему, для любых контрактов формальная верификация будет особенно востребована: исправить ошибку контракта после его запуска, как правило, невозможно.
А цена таких ошибок бывает очень высока, так как на смарт-контрактах зачастую хранятся довольно крупные суммы средств.

Моя символьная виртуальная машина написана на PHP и Python, и использует Z3Prover от Microsoft Research для решения получившихся SMT формул.

В её ядре заложен мощный мульти-транзакционный поиск, который
позволяет находить решения или уязвимости, даже если для этого требуется много транзакций.
Даже Mythril, один из самых мощных символьных фреймворков для поиска уязвимостей Ethereum, добавил такую возможность лишь несколько месяцев назад.

Но стоит заметить, что контракты эфира сложнее и обладают Тьюринг-полнотой.

PHP транслирует исходный код смарт-контракта RIDE в python скрипт, в котором программа представлена в виде совместимой с Z3 SMT системы состояний контракта и условий их переходов:

Теперь опишу, что происходит внутри, поподробней.

Но вначале пару слов о языке смарт-контрактов RIDE.

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

К каждому кошельку можно привязать RIDE контракт, и результатом выполнения будет только TRUE или FALSE.

TRUE означает, что смарт-контракт разрешает транзакцию, а FALSE что он её запрещает.
Простой пример: скрипт может запрещать перевод, в случае если баланс кошелька меньше чем 100.

В качестве примера я возьму всё тех же Волка, Козу, и Капусту, но уже представленных в виде смарт-контракта.

Пользователь не сможет вывести деньги с кошелька, на котором развернут контракт, пока не переправит всех на другой берег.

PHP первым делом извлекает из смарт-контракта все переменные в виде их ключей и соответствующего переменной логического выражения.

Затем PHP преобразует их в совместимое с Z3Prover SMT описание системы на питоне.
Данные же заворачиваются в цикл, где переменные хранилища получают индекс i, переменные транзакции индекс i + 1, а переменные с выражениями задают правила перехода из предыдущего состония в следующее.

Это- самое сердце нашей виртуальной машины, которое и обеспечивает мульти-транзакционный механизм поиска.

Условия сортируются и вставляются в шаблон скрипта, предназначенного для описания SMT системы на питоне.

Для последнего состояния из всей цепочки применяются правила, которые заданы в разделе транзакции перевода.

А значит, Z3Prover будет искать именно такие совокупности состояний, которые в итоге позволят вывести с контракта средства.

В итоге мы автоматически получаем полностью работоспособную SMT модель нашего контракта.
Можно заметить, что она весьма похожа на модель из моей предыдущей статьи, которую я составлял ещё вручную.

После запуска, Z3Prover решает смарт-контракт и выводит нам цепочку транзакций, которая позволит вывести средства:

Кроме контракта переправы, можно поэкспериментировать с собственными контрактами или попробовать этот простой пример, который решается за 2 транзакции.

Так как это самая первая версия, то синтаксис весьма ограничен и могут встречаться баги.
В следующих статьях я планирую осветить дальнейшую разработку VM, и показать, как можно создавать формально верифицированные смарт-контракты с её помощью, а не только решать их.

Источник

Верификация и валидация ПО: технологии и инструменты

Сейчас как никогда актуальна проблема обеспечения качества ПО: даже единичный отказ может привести к ликвидации компании или человеческим жертвам. Как обеспечить качество ПО и постоянно поддерживать его на требуемом уровне?

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

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

Сегодня организации вкладывают около 30% бюджета, выделяемого на ИТ, в обеспечение качества и тестирование, что неудивительно — более половины всех систем являются критически важными для бизнеса [1]. При этом компаниям и организациям необходимо максимально гибко реагировать на изменения и внедрять формализованные процессы и методы контролируемого выпуска безопасного ПО. Активно внедряются механизмы автоматического обновления ПО по Сети, методы DevOps и «непрерывная инженерия» (continuous software engineering) [2], что повышает потребность в процессах непрерывной верификации и валидации, требующих намного более тщательного, чем еще совсем недавно, выполнения процедур испытания на общую работоспособность.

Методы Agile и непрерывной разработки ПО, направленные на повышение качества и удовлетворение требований пользователей, должны опираться на эффективные, удобные в применении инструменты, которые могут войти в арсенал как разработчиков ПО, так и пользователей. Кроме того, оценка качества может проводиться третьей стороной — аккредитованной лабораторией или сертификационным центром.

Выбор методов верификации и валидации ПО зависит от модели разработки (V-модель, каскадная, спиральная и т. д.) и стандарта (ISO/IEC 25000 SQUARE, ISO/IEC 12207:2017) (рис. 1).

Рис. 1. Стандарты обеспечения качества процесса разработки ПО и конечного продукта

За качество собственно процесса разработки ПО отвечают стандарт ISO/МЭК 12207, регламентирующий процессы верификации и валидации, а также V-модель, в рамках которой каждой задаче разработки ставится в соответствие процесс тестирования. Например, модульный тест проверяет соответствие исходного кода низкоуровневой архитектуре, интеграционные тесты проверяют совместимость (интеграцию) ранее протестированных компонентов, системные тесты позволяют выяснить, соответствует ли полностью интегрированный продукт спецификациям, а приемочные тесты — отвечает ли продукт ожиданиям пользователя.

В стандартах серии ISO 25000, относящихся к качеству программного продукта, выделены следующие характеристики ПО:

На рис. 2 изображены элементы обеспечения качества процессов и продуктов и соответствующие инструменты. Данная схема может помочь в выборе средств верификации и валидации, которые можно задействовать на каждом из этапов V-модели и для каждого параметра качества ПО.

Рис. 2. Инструменты для проверки основных характеристик качества ПО

На этапе написания кода чаще применяются средства статического анализа, позволяющие непосредственно в интегрированной среде разработки контролировать соответствие кода стандартам. В то же время в рамках статического анализа проверяются особенности структуры модулей и архитектуры ПО, поэтому на рис. 2 поле средств статического анализа размещено на одном уровне с написанием кода, но захватывает тесты, касающиеся верификации архитектуры. Средства статического анализа имеют отношение ко всем четырем характеристикам качества.

Технологии и инструменты

Средства XUnit применяются для проверки правильности работы каждого разработанного модуля, при этом необходимо обеспечить максимальное покрытие кода. Фреймворки XUnit получили наиболее широкое распространение среди технологий автоматизации тестирования, позволяя на специальных языках описывать тестовые ситуации и автоматически их выполнять.

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

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

Инструментов тестирования так же много, как и языков программирования. В табл. 1 приведены основные средства тестирования для первой десятки наиболее популярных языков программирования (согласно рейтингу Tiobe).

Инструменты контроля сопровож-даемости. Позволяют анализировать исходный код и проверять его на соответствие правилам модульности, читаемости и др. (табл. 2).

Инструменты контроля удобства использования. Применяются для оценки программного продукта в процессе работы с ним реальных пользователей. В то же время такие инструменты позволяют проводить валидацию пользовательского интерфейса без участия самих пользователей (табл. 3).

Средства контроля безопасности. Позволяют обнаруживать уязвимости в системе и определять, защищает ли она данные при сохранении необходимой функциональности. В частности, средства испытания на защиту от проникновения имитируют атаки на программную систему или сеть с помощью сканирования и других действий, направленных на поиск и использование слабых мест. Их также называют инструментами этичного, или белого, хакерства (табл. 4).

Средства проверки производительности. Позволяют выяснить, насколько быстро система работает под нагрузкой (табл. 5). Эти средства не предназначены для поиска дефектов в приложении, а применяются для оценки измеримых характеристик: времени отклика, пропускной способности и т. д.

Средства непрерывной верификации и валидации. Принцип непрерывного обеспечения качества предполагает тесную интеграцию процессов верификации и валидации на всех этапах разработки. Типичный пример — разработка с ориентацией на тестирование: плановые показатели качества задаются еще до разработки ПО. С учетом преимуществ непрерывной интеграции, одной из основ DevOps, все большее значение придается инструментам, помогающим не только автоматизировать верификацию и валидацию, но и интегрировать эти процессы в цикл разработки. Перечисленные в табл. 6 инструменты позволяют проверять характеристики качества в рамках сред непрерывной интеграции Jenkins, Travis CI, Bamboo, GoCD, Ansible и т. п. Требуется встроить валидацию и верификацию в жизненный цикл ПО, обеспечив автоматическое, прозрачное для разработчиков выполнение соответствующих процессов. Представленные в табл. 6 инструменты проверяют несколько характеристик качества и позволяют получить данные для глобальной оценки и визуализации. В рамках процессов непрерывной верификации и валидации также могут применяться инструменты модульного тестирования, фиксации и замены и статического анализа.

Для управления действиями, выполняемыми при помощи всех перечисленных видов инструментов, и контроля над процессом верификации и валидации в целом, применяются средства управления тестовыми случаями: Test Link, Test Rail, Microfocus Quality Center, VSTS, IBM Rational Quality Manager, XStudio и др.

Перспективы

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

В современном мире становится все больше рисков, связанных с ростом количества угроз кибербезопасности и проблемами, обусловленными неудобством использования приложений. Это означает, что нужно ускорить развитие технологий верификации и валидации, а также удвоить усилия, направленные на повышение надежности систем. В частности, необходимы сценарии мягкой деградации возможностей ПО и его работы в условиях отказа.

Избежать обнаружения злоумышленниками критических уязвимостей и появления новых атак после выпуска продукта помогут непрерывная верификация и валидация, которые должны стать основой стратегии обеспечения качества ПО. Необходима возможность гибко вносить исправления и изменения с использованием беспроводных сетевых соединений. Понадобятся механизмы, препятствующие запуску систем в случае, если на них не установлены самые свежие обновления программного обеспечения. В число таких систем входят автомобили, производственные линии и иное оборудование, требующее особо высокого уровня безопасности. Еще в большей степени это касается медицинской техники — для нее нужна иерархическая система контроля качества.

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

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

Аристотель говорил: «Совершенство — это не действие, а привычка». Широкий выбор инструментов — это важно, но главное — создание культуры обеспечения качества ПО и приобретение соответствующих навыков.

1. Capgemini. MicroFocus, and Sogeti. World quality report. 2018. [Online]. URL: https:// www.capgemini.com/service/world-quality-report-2018-19/ (дата обращения: 16.05.2019).

2. B. Fitzgerald, K. Stol. Continuous software engineering: A roadmap and agenda // J. Syst. Softw.— 2017 (Jan). — Vol. 123. — P. 176–189.

Моисес Родригес (mrodriguez@aqclab.es) — доцент, Марио Пьяттини (mario.piattini@uclm.es) — профессор, Университет Кастилии-Ла-Манчи (Испания); Кристоф Эберт (christof.ebert@vector.com) — директор, Vector Consulting Services.

Moises Rodriguez, Mario Piattini, Christof Ebert, Software Verification and Validation Technologies and Tools. IEEE Software, March/April 2019, IEEE Computer Society. All rights reserved. Reprinted with permission.

Поделитесь материалом с коллегами и друзьями

Источник

Валидация и верификация требований к системе

Очень часто путают два понятия валидация и верификация. Кроме того, часто путают валидацию требований к системе с валидацией самой системы. Я предлагаю разобраться в этом вопросе.

В статье «Моделирование объекта как целого и как композиции» я рассмотрел два подхода к моделированию объекта: как целого и как конструкции. В текущей статье нам это деление понадобится.

Пусть у нас есть проектируемый функциональный объект. Пусть этот объект рассматривается нами как часть конструкции другого функционального Объекта. Пусть есть описание конструкции Объекта, такое, что в нем присутствует описание объекта. В таком описании объект имеет описание как целого, то есть, описаны его интерфейсы взаимодействия с другими объектами в рамках конструкции Объекта. Пусть дано описание объекта как конструкции. Пусть есть информационный объект, содержащий требования к оформлению описания объекта как конструкции. Пусть есть свод знаний, который содержит правила вывода, на основании которых из описания объекта как целого получается описание объекта как конструкции. Свод знаний – это то, чему учат конструкторов в институтах – много, очень много знаний. Они позволяют на основе знанию об объекте спроектировать его конструкцию.

Итак, можно начинать. Мы можем утверждать, что если правильно описан объект как целое, если свод знаний верен, и если правила вывода были соблюдены, то полученное описание конструкции объекта, будет верным. То есть, на основе этого описания будет построен функциональный объект, соответствующий реальным условиям эксплуатации. Какие могут возникнуть риски:

1. Использование неправильных знаний об Объекте. Модель Объекта в головах у людей может не соответствовать реальности. Не знали реальной опасности землетрясений, например. Соответственно, могут быть неправильно сформулированы требования к объекту.

2. Неполная запись знаний об Объекте – что-то пропущено, сделаны ошибки. Например, знали о ветрах, но забыли упомянуть. Это может привести к недостаточно полному описанию требований к объекту.

3. Неверный свод знаний. Нас учили приоритету массы над остальными параметрами, а оказалось, что надо было наращивать скорость.

4. Неправильное применение правил вывода к описанию объекта. Логические ошибки, что-то пропущено в требованиях к конструкции объекта, нарушена трассировка требований.

5. Неполная запись полученных выводов о конструкции системы. Все учли, все рассчитали, но забыли написать.

6. Созданная система не соответствует описанию.

Понятно, что все артефакты проекта появляются, как правило, в завершенном своем виде только к концу проекта и то не всегда. Но, если предположить, что разработка водопадная, то риски такие, как я описал. Проверка каждого риска – это определенная операция, которой можно дать название. Если кому интересно, можно попытаться придумать и озвучить эти термины.

Что такое верификация? По-русски, верификация – это проверка на соответствие правилам. Правила оформляются в виде документа. То есть, должен быть документ с требованиями к документации. Если документация соответствует требованиям этого документа, то она прошла верификацию.

Что есть валидация? По-русски валидация – это проверка правильности выводов. То есть, должен быть свод знаний, в котором описано, как получить описание конструкции на основе данных об объекте. Проверка правильности применения этих выводов – есть валидация. Валидация — это в том числе проверка описания на непротиворечивость, полноту и понятность.

Часто валидацию требований путают с валидацией продукта, построенного на основе этих требований. Так делать не стоит.

Источник

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

Безопасная система – и в особенности система, которая используется для обеспечения безопасности – должны быть доверенной. Однако что лежит в основе этого доверия? Что придает уверенность в том, что основные компоненты системы реализованы правильно и не подведут в критический момент? В предыдущей статье, посвященной безопасной ОС, этот вопрос вскользь упоминался, и, как и обещали, мы возвращаемся этой теме.

Верификация и валидация используются для проверки того факта, что система, программа или аппаратное устройство в действительности обладает ожидаемыми свойствами. Эти два понятия (V&V) хоть и схожи по звучанию и постоянно используются вместе, означают существенно разные типы проверок. Напомним на всякий случай:

Если говорить еще проще, верификация задается вопросом, строим ли мы систему правильно, а валидация – строим ли мы правильную систему. И если для ответа на второй вопрос существенную играет роль экспертная оценка (от валидации собственно требований к системе до тестирования конечного продукта), то уверенный ответ на первый вопрос способны дать только формальные методы.

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

Когда говорят про верификацию программы, чаще всего представляют некий магический вычислитель, который принимает на вход программный код и по нажатию кнопки – хоп – выдает вердикт: код верен или неверен, безопасен или нет. При малейшем рассмотрении этой идеальной картинки возникает множество вопросов. Первый из них, а что мы, собственно, хотим доказать? На какие вопросы способна дать ответ верификация системы? Корректность, полнота, непротиворечивость, неизбыточность данных, безошибочность и безопасность функционирования… Немного сухих фактов: некоторое время назад было доказано, что все множество свойств системы можно представить как композицию двух базовых:

Однако, одно дело – понимание того, что целевое свойство системы может быть представлено как композиция более простых свойств, а другое дело – корректная формализация таких свойств, с учетом того, что они должны не потерять свой действительный смысл, а иначе весь трудоемкий процесс окажется бесполезным. Случается, что требуемые свойства доказываются для ситуаций, когда система фактически не функционирует. Иногда для того, чтобы учитывать только реалистичные ситуации, дополнительно учитывается произвольное свойство справедливости (все как в жизни).

Для формализации описанных таким образом критериев часто используется аппарат классической или темпоральной логики, а для верификации – соответствующие языки. В частности, для классических условий довольно популярен Prolog, для темпоральных – языки Promela, SPIN. Но это далеко не единственный способ. Описание формальных условий поведения компьютерных программ и верификация относительно этих правил настолько специфичная и востребованная проблема, что в 1969 году была создана специальная формальная теория – алгоритмическая логика Хоара, предназначенная для дедуктивного доказательства правильности программ и способная приблизить сухие спецификации к семантике программ на императивных языках. В настоящее время выработан еще более жизненный подход к описанию критериев – в виде контрактных спецификаций программных интерфейсов.

Другая проблема – выбор и формализация объекта верификации. И несмотря на то, что верификация, казалось бы, процедура, состоящая в точном вычислении, при этом выборе нужно ориентироваться на требуемую степень уверенности в результате.

К примеру, для верификации может быть выбрана статическая конфигурация системы – значения системных параметров, информация об установленных приложениях и разрешения политики безопасности. Эти данные подаются на вход решателю, который на основе заранее заданных экспертом логических правил производит вычисления, иногда довольно сложные, и сообщает результат. К примеру, такой решатель может определить, возможен ли в системе некоторый вид атаки, или может ли пользователь получить неавторизованный доступ к каким-либо ресурсам.

Верификация конфигурации способна дать уверенность в том, как будет вести себя система, при условии, что мы доверяем поведению ее компонентов. То есть системные и прикладные программы должны вести себя так, как задано в их спецификациях, не содержать ошибок и уязвимостей, эксплуатация которых могла бы повлиять на фактическое поведение системы. 1

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

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

Другой подход к обеспечению верифицируемости кода при его создании – использование парадигмы контрактного программирования. В этом случае перед созданием кода определяются точные формальные (контрактные) спецификации интерфейсов, задающие предусловия (обязательства со стороны клиентов интерфейсов), постусловия (обязательства поставщика) и инварианты (обязательства по выполнению конкретных свойств). Контрактное программирование поддерживается многими языками, в том числе расширениями Java и C.

Верификация программного кода «в лабораторных условиях» может вызывать нарекания в том случае, если поведение кода в большой степени определяется его окружением. Неплохо, конечно, если система построена из слабо связанных компонентов с хорошо документированными интерфейсами – однако в реальных системах достаточно сложно предсказать влияние окружения на поведение отдельно взятого компонента. В этих случаях для оценки корректности системы приходится прибегать к анализу поведения параллельно работающих компонентов. Формальная проверка того, выполняется ли заданная логическая формула на модели системы, описывается в рамках метода, известного как Model checking. Этот метод аккумулирует существующие достижения в верификации систем и широко применяется по всему миру для проверки сложных аппаратных и программных комплексов. За работы, внесшие существенный вклад в его развитие, дважды вручалась премия Тьюринга (первый раз – в 1996 году Амиру Пнуели за «плодотворную работу по внедрению темпоральной логики в вычислительные науки, и за выдающийся вклад в верификацию программ и систем», и второй в 2007 году – ученым Кларку, Эмерсону и Сифакису «за их роль в развитии проверки на модели — высокоэффективную технику верификации программ, широко применяемую при разработке как программного, так и аппаратного обеспечения»). В настоящее время методы model checking применяются и за пределами верификации технических систем, для которых этот метод был изначально разработан.

При вручении премии Тьюринга президент ACM Стьюарт Фельдман сказал и методе Model checking: «Это великий пример того, как технология, изменившая промышленность, родилась из чисто теоретических исследований». Можно с уверенностью утверждать, что если будущее во всех областях жизни от устройств бытового назначения до критических инфраструктур за развитыми, умными и безопасными во всех смыслах технологиями, то методы V&V обеспечивают путь в это будущее.

В одной статье невозможно охватить все вопросы. Для заинтересовавшихся рекомендуем прочитать:

1 Это как раз тот случай, когда механизм валидации (на основе знаний об уязвимости ПО) помог бы или отвергнуть меры анализа конфигурации, или ввести компенсационные меры (своевременное обновление потенциально проблемного ПО) с принятием остаточных рисков. >>

2 Заметим, что верификация конфигурации и верификация программного обеспечения — не взаимозаменяемые меры. Если проверка программного кода гарантирует ожидаемое поведение программных компонентов, то проверка конфигурации обеспечивает выполнение политики безопасности при работе этих компонентов. >>

3 Однако они могут служить для валидации программного кода. >>

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • Что такое велосипед в программировании
  • что такое вектор с точки зрения программирования
  • Что такое вектор программа
  • Что такое вектор в программировании
  • Что такое вектор в программировании это массив

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии