单赋值程序验证形式化:一种适应完备的方法
1. 引言
近年来,演绎程序验证取得了一定的成熟度,现在有许多工具可供用户证明用 C、Java 或 SPARK 等现实世界语言编写的程序的属性。演绎技术试图根据规范(通常以一阶逻辑表示的一组契约的形式给出)来确定软件系统的正确性,其精度依赖于用户以注释(特别是循环不变式)形式提供的信息。
现代程序验证器的发展呈现出三个趋势:
- 使用 SMT 求解器 :采用可满足性模理论(SMT)求解器来检查一阶公式的有效性。核心组件是验证条件生成器(VCGen),它将程序和规范作为输入,生成一组一阶证明义务并发送给求解器。如果所有条件都有效,则程序正确。
- 基于通用验证语言 :演绎验证工具通常是通用的,基于为验证量身定制的编程语言。特定语言的程序会被翻译成工具的中间语言,并对该语言的相关方面进行背景编码。例如 Boogie 和 Why3 是广泛使用的通用验证器。
- 采用单赋值(SA)表示 :现代工具在内部使用代码的单赋值(SA)表示,其中变量在被读取或写入后不能再被赋值。SA 分支程序不仅在逻辑上更容易编码,还解决了一个基本的效率问题。从标准命令式代码生成的验证条件的大小可能是程序大小的指数级,这使得有效验证合理大小的程序变得困难。而将代码转换为 SA 形式可以生成二次大小的验证条件(后来还提出了一种相对于 SA 程序生成线性大小条件的技术)。此外,SA 表示不会丢失计算的中间值,规范语言可以方便地使用变量在给定程序点的值,连续不变式也会自动传输。
程序验证的理论基础传统上基于两个不同的框架:Dijkstr
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



