Page 73 - 《软件学报》2025年第8期
P. 73

3496                                                       软件学报  2025  年第  36  卷第  8  期


                 操作系统. 在该项目中, 研究人员使用了           Spec#和  Boogie 等验证工具对操作系统的关键组件进行了形式化验证, 确
                 保了组件之间的接口契约. 这种契约式的验证方法提高了系统的可靠性, 并显著减少了运行时错误的发生.
                    下面介绍    Rust 程序的形式化验证方面已有的一部分工作.
                    Cui 等人  [10] 通过静态数据流分析检测      Rust 程序中的内存释放错误, 提高了内存安全性. Dai 等人            [11] 通过  Coq
                 定理证明器证明了       Rust 实现的页表在    Software Enclave Hypervisor 中的正确性. CRust 采用有界模型检测的技术
                 针对  Rust 中的不安全代码的内存安全性质进行验证             [12] . 主要的技术原理是使用工具将       Rust 程序翻译为   C  语言实
                 现的程序, 然后在     CBMC  工具  [13] 中进行验证. Prusti [14,15] 证明工具与  CRust 工具类似, 不同的是先使用 MIR  提供的
                 语言类型通过分离逻辑方式合成程序证明, 然后将                 Rust 语言转换为一种中间语言        Silver, 并使用验证框架    Viper
                 中的符号执行工具进行验证. 该工作的不足之处是不支持闭包, 生命周期等特性的验证. RustBelt 是由来自                            MPI-
                 SWS  的  Ralf Jung  主导的一个研究项目  [16−18] , 旨在对  Rust 语言的核心安全性进行形式化验证. RustBelt 使用了交
                 互式定理证明器      Coq, 通过  Iris 并发分离逻辑框架对     Rust 的类型系统和借用检查器进行了详细建模和验证. 通过
                 这项工作, 研究人员证明了        Rust 的核心语言特性, 如所有权和借用, 能够确保内存安全性和数据竞争的防止. 本文
                 对于  unsafe 代码的语义模型的建立参考了该项工作.
                    当前关于操作系统内核的基于定理证明器的验证中针对                     C/C++构建的传统架构内核居多, 对于使用            Rust 构
                 建的新型架构内核验证的相关工作相对空白, 而针对                 Rust 程序的验证, 特别是基于定理证明的形式化验证工作非
                 常少, RustBelt 项目虽然对  Rust 底层的安全机制进行了探索与验证, 但并没有应用到实际                  Rust 构建的系统中.

                 2   基础知识

                    本文在交互式定理证明器          Coq  中利用  Iris 验证框架对某使用    Rust 构建的新型架构内核中任务管理和调度模
                 块的正确性进行验证. 下面对基本知识进行简要介绍.

                 2.1   定理证明器  Coq
                    Coq  是一个高级的交互式定理证明器           [19] , 它允许用户编写形式化证明, 这些证明可以由计算机检查以确保
                 它们的正确性. Coq    使用了一种名为“构造演算”的形式语言, 这是一个包含高阶逻辑的强类型函数式编程语言.
                 它广泛用于研究领域, 特别是在软件和硬件验证、形式化数学以及其他需要高可信度的场景中. Coq                                 的类型系
                 统支持   dependent types, 这意味着类型可以依赖于值. 这种能力极大地增强了语言的表达能力, 允许用户表达丰
                 富的逻辑和数据结构. Coq       基于构造主义逻辑, 这意味着它不接受经典逻辑中的排中律                      (每个命题都是真或假
                 的) 和选择公理. 在    Coq  中, 证明某事存在相当于提供一个构造该事物的方法. Coq               包含一个证明助手, 帮助用户
                 通过一步一步的      tactics 来构建证明. 每个策略可以修改当前的证明状态或引入新的假设. Coq                   支持模块化编程,
                 允许用户编写可重用的库和模块, 这些库和模块可以被不同的项目共享和使用. Coq                           被用来验证软件程序的正
                 确性, 包括操作系统内核、编译器和其他关键系统. 例如, CompCert C                编译器   [20] 就是一个被证明为语义保持的
                 编译器, 采用   Coq  进行正确性验证. Coq     也被用于形式化数学证明, 包括著名的四色定理                [21] 和费马大定理  [22] 的
                 部分证明.

                 2.2   并发分离逻辑证明框架      Iris
                    Iris [23−25] 是用于构建高级并发程序验证的框架, 它在       Coq  定理证明器上实现. Iris 使用高阶分离逻辑, 提供强大
                 的抽象和模块化机制, 这使得它非常适合用来验证复杂的并发系统和软件. Iris 基于高阶分离逻辑, 能够处理可变
                 状态, 允许逻辑公式中包含资源的概念. 分离逻辑特别适合于并发和并行计算的情境, 因为它可以清晰地描述和推
                 理那些由多个线程或进程共享和修改的资源. Iris 的计支持高度模块化, 使得用户可以构建可复用的验证组件. 这
                 对于处理大规模软件系统特别重要, 因为它减少了验证工作的重复性, 并提高了代码的可维护性. Iris 能够处理动
                 态分配的资源, 用户可以在逻辑中动态地创建和销毁资源, 这对于处理复杂的动态行为至关重要. IPM (Iris proof
                 mode) 提供了一组定制的策略       (tactics), 这些策略专门针对 Iris 逻辑的特点进行了优化. 例如, 这里给出一个简单的
                 并发加法器在     IPM  中的证明过程. 首先定义加       1  和不变式以及需要证明的引理.
   68   69   70   71   72   73   74   75   76   77   78