Вы находитесь на странице: 1из 29

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

Bugs are Everywhere!


Bugs are Everywhere!
Что делать?

Тестировать!

● долго и трудозатратно

● иногда тестирование затруднено


○ например, многопоточные и распределенные системы

● тестирование не дает гарантий отсутствия дефектов!


Formal Verification

Formal verification is the act of proving or disproving the


correctness of intended algorithms underlying a system with
respect to a certain formal specification or property
Что делать?

Верифицировать (?)

Следствие Теоремы Успенского-Райса:


Не существует алгоритма, который для произвольной программы
на Тьюринг-полном языке, точным образом определял,
обладает ли она данным семантическим свойством или нет!

будьте осторожны, с тем

● что именно вы доказываете и


● на каких предположениях основаны
ваши рассуждения!
Методы формальной верификации

Fisher, K., Launchbury, J., & Richards, R. (2017). The HACMS program: using formal methods to eliminate exploitable bugs.
Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences.
Методы формальной верификации

● Выразительная сила — насколько сложные свойства можем проверять

● Трудоемкость — насколько сложно применять метод

● Масштабируемость — насколько увеличивается время работы / сложность с ростом программы


Static Analysis

● Аппроксимируем поведение программы

● Абстракная интерпретация: интерпретируем


программу использую не конкретные значения, а
некоторую их абстракцию

https://en.wikipedia.org/wiki/Abstract_interpretation#/media/File:Combination_of_abstract_domains.svg
Static Analysis

● Аппроксимируем поведение программы

● Абстракная интерпретация: интерпретируем


программу использую не конкретные значения, а
некоторую их абстракцию

○ Sound — если анализ утверждает, что


программа обладает свойством P то она
действительно обладает этим свойством
http://www.pl-enthusiast.net/2017/10/23/what-is-soundness-in-static-analysis/
○ Complete — все программы, обладающие
свойством P, помечаются анализом как
обладающие этим свойством
Static Analysis
Static Analysis — Continuous Integration
Static Analysis

● Выразительная сила ⬊
● Трудоемкость ⬊
● Масштабируемость ⬈
Type Systems

Well typed programs cannot go wrong!


Type Systems

Kotlin: null-safety
Type Systems

Rust: memory-safety & race-freedom

https://theburningmonk.com/2015/05/rust-memory-safety-without-gc/
Type Systems

● Выразительная сила ⬊
● Трудоемкость ⬂
● Масштабируемость ⬈
Model Checking

● Строим некоторое представление пространства состояний программы

● Выполняем его "обход" и проверяем заданные свойства

Explicit Model Checking Symbolic Model Checking

● явно строим граф пространства состояний ● кодируем пространство состояний


логической формулой
Model Checking

Source Code Verification Model Verification

CBMC
Model Checking: TLA+ Example

https://learntla.com/introduction/example/
Model Checking

● Выразительная сила ⬂
● Трудоемкость ⬊
● Масштабируемость ⬊
Deductive Verification

Program ✓
Translator
Proof
Obligations Correct?
Why3

Spec
∃∀

Coq
Deductive Verification

Why3
Deductive Verification

http://viper.ethz.ch/tutorial/?page=1&section=#introduction
Deductive Verification

● Выразительная сила ⬀
● Трудоемкость ⬀
● Масштабируемость ⬀
Certified Programming

● Пишем код и спецификацию на языке с зависимыми типами

○ Спецификация — тип

○ Если программа проходит проверку типов — она удовлетворяет спецификации

○ Получаем код корректный по построению

Coq
Certified Programming
Certified Programming: Examples

● CompCert — формально верифицированный компилятор C // Coq

● RustBelt — верифицированное подмножество семантики языка Rust // Coq

● Sel4 — верифицированное микроядро операционной системы // Isabelle


Certified Programming

● Выразительная сила ⬈
● Трудоемкость ⬈
● Масштабируемость ⬊

Вам также может понравиться