Abstract

In recent years, ISP RAS has been developing a system for machine (binary) code deductive verification. The motivation is rather clear: modern compilers, such as GCC and Clang/LLVM, are not free of bugs; thereby, it is not superfluous (at least for safety- and security-critical components) to check the correctness of the generated code. The key feature of the suggested approach is the ability to reuse source-code-level formal specifications (pre- and postconditions, loop invariants, lemma functions, etc.) at the machine code level. The tool is highly automated: provided that the target instruction set is formalized, it disassembles the machine code, extracts its semantics, adapts the high-level specifications, and generates the verification conditions. The system utilizes a number of third-party components including a source code analyzer (Frama-C), a machine code analyzer (MicroTESK), and an SMT solver (CVC4). The modular design enables replacing one component with another when switching an input format and/or a verification engine. In this paper, we discuss the tool architecture, describe our implementation, and present a case study on verifying the memset C library function.

Highlights

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

  • ISP RAS has been developing a system for machine code deductive verification

  • The system utilizes a number of third-party components including a source code analyzer (Frama-C), a machine code analyzer (MicroTESK), and an SMT solver (CVC4)

Read more

Summary

Введение

Роль программного обеспечения (ПО) в критической информационной инфраструктуре постоянно растет. В результате сейчас крайне востребованы прикладные методы и инструменты обеспечения корректности наиболее ответственных компонентов ПО. Для доказательства такого рода свойств применяют методы дедуктивной верификации. Все известные инструменты дедуктивной верификации императивных программ следуют единому подходу [8]: Гладышев И.В., Камкин А.С., Коцыняк А.М., Путро П.А., Хорошилов А.В. Одно из предположений состоит в том, что машинный (бинарный) код, сгенерированный компилятором, соответствует семантике языка программирования. Что эту гипотезу можно принять только для верифицированных компиляторов, например, CompCert [9], используемых в основном в исследовательских проектах. К сожалению, они слишком сложны для верификации, и ошибки в сгенерированном машинном коде не являются редкостью [10]. делается обзор работ, посвященных дедуктивной верификации программ на уровне бинарного кода. описывается архитектура системы дедуктивной верификации машинного кода. В разд. 5 делается заключение и обрисовываются направления дальнейших исследований

Обзор литературы
Предлагаемая архитектура
Модуль извлечения машинного кода
Модуль анализа машинного кода
Модуль анализа исходного кода
Модуль проверки корректности
Модуль проверки эквивалентности
Модуль доказательства теорем
Апробация подхода
Заключение
Full Text
Published version (Free)

Talk to us

Join us for a 30 min session where you can share your feedback and ask us any queries you have

Schedule a call