Upload
others
View
14
Download
0
Embed Size (px)
Citation preview
程序验证中的自动定理证明技术研究
李兆鹏
中科大-耶鲁高可信软件联合研究中心
2009.12.12
提纲
研究背景
出具证明编译器
自动定理证明技术
演示和总结
研究背景 1/2
携证明代码(Proof-Carrying Code)带来两方面挑战 类型或逻辑系统的研究 出具证明编译技术的研究
研究中心目标:构建经过验证的系统软件(Certified System Software)
研究中心目前开展的研究项目(部分) 操作系统内核验证 并行程序的编译与验证 出具证明编译器 自动定理证明技术研究 基于形状系统的支持指针程序验证
研究背景 2/2
构造经过验证的软件的方法
带有标注的源程序
出具证明编译器
汇编代码证明
检查器
OS内核并行软件
手工验证
验证框架
提纲
研究背景
出具证明编译器
自动定理证明技术
演示和总结
出具证明编译器的研究 1/5
研究动机
连接源级验证与汇编级验证
源级验证更友好,报错更精确
汇编级验证被信任计算基础更小
某些模块必须用汇编语言来编码
提高经过验证的系统软件的生产率
编译技术
自动定理证明技术
出具证明编译器的研究 2/5
相关工作:验证编译器(Certified Compiler) 经过形式化证明,输
出程序与输入源程序的可观察语义一致。
编译器(尤其是包含复杂优化后)验证困难大,编译器改动后需要重新证明。
验证编译器
源程序
汇编代码
证明
证明
程序规范
程序规范
出具证明编译器的研究 3/5
源级验证系统基于 扩展的Hoare逻辑规则
验证条件(VC)生成器和定理证明工具
/*Quotient-Remainder Example*/
{true}
R = x; Q = 0;
{R=x Q=0}
While(y<=R) { {x=R+y*Q}
R = R-y Q = Q+1;
}
{x=R+y*Q R<y}
R=x Q=0 x=R+y*Q
x=(R-y)+y*(Q+1) y<=R
x=R+y*Q
x=R+y*Q ¬(y<=R)
x=R+y*Q R<y
验证条件(从前向后演算)
出具证明编译器的研究 4/5
出具证明编译器
原型I(2006-2007)
PointerC出具证明编译器
标注的C程序(PointerC语言)
x86汇编代码证明
源级验证条件生成器
定理辅助证明 工具
Coq
证明翻译生成器
验证条件
证明
部分验证条件在Coq中手工证明
语言:C语言子集逻辑:指针逻辑
出具证明编译器的研究 5/5
出具证明编译器
原型II(2008至今)标注的C代码
x86汇编代码证明
语言:C语言子集逻辑:分离逻辑
CComp出具证明编译器
源级验证条件生成器
VC证明翻译器与目标证明生成器
自动定理证明器
代码规模:~3.2万行SML代码~1.6万行Coq代码
自动定理证明器 1/2
CComp出具证明编译器中的自动定理证明
线性整型定理证明器
待证明公式
分离逻辑定理证明器
其他领域专用证明器
自动定理证明器
证明记录 证明输出
证明(Coq可检查的证明项)
自动定理证明器 2/2
线性整型定理证明器
基于Simplex决策过程
采用Coq的ZArith等库构造证明项
分离逻辑自动定理证明器
支持分离逻辑片段和内建谓词(list tree等)
构建了一个分离逻辑引理库以支持证明输出
自动定理证明技术是出具证明编译器的瓶颈
仅支持简单的程序和规范
仅支持简单的程序逻辑
提纲
研究背景
出具证明编译器
自动定理证明技术
演示和总结
自动定理证明技术 1/5
研究现状 微软研究院的Z3 (SMT solver)
支持多理论 自动,但仅输出Yes/No
证明辅助工具Coq/Isabelle等 需要交互完成(半自动) 可以输出证明项(Proof Term,lambda演算的项)
其他领域专用逻辑(Domain-Specific Logic)证明器 Smallfoot:简单命令式语言+分离逻辑片段上的检查器 jStar :Java子集+分离逻辑片段上的检查器 … 缺点:逻辑表达能力较弱、自动但不输出证明项
自动定理证明技术 2/5
领域专用逻辑定理证明 验证中针对特定问题(如操作系统特定模块)设计
一种专用逻辑 避免设计一种通用逻辑(General Logic)的困难 更容易地实现自动证明
应用前景 构建经过验证软件的关键技术之一 提升出具证明编译器编译验证能力 应用于操作系统内核验证、并行程序验证 …
自动定理证明技术 3/5
研究领域专用逻辑自动定理证明方法
正在开展的工作
分离逻辑等自动定理证明器
关键点和难点:
设计证明策略库、引理库是本研究的关键
设计自动搜索证明路径的算法
输出简洁的证明项是一个难点
将要开展的工作
基于形状图指针程序验证条件自动证明器
基于形状系统的指针程序验证系统
形状系统
源代码级的验证
引入形状描述,标注变量对应的形状
支持常规的数据结构:单链表、双链表、树等
支持复杂数据结构指针程序的验证
推断前后条件、循环不变式
GNU C Library请求队列与就绪队列
自动定理证明技术 4/5
研究产生简洁证明项的一般方法 研究动机
目前自动定理证明器不输出严格的证明项
证明项是PCC代码包的重要组成
在编译过程中很难对复杂的证明项进行向下“编译”
正在开展的工作 通过构建、优化引理库和策略库,简化证明项
关键点和难点 抽取常用的性质证明作为引理
把握证明项和策略序列的灵活使用
证明项形式兼顾出具证明编译器后端的使用是一个难点
自动定理证明技术 5/5
研究从领域专用逻辑的描述生成自动定理证明的方法
长期目标
用户提供逻辑的描述
断言语言、逻辑规则、部分引理和策略
设计并实现一种工具来生成自动定理证明器
如同利用Yacc来生成编译器的语法分析器一样
难点:如何判断给定策略是否可行、充足
提纲
研究背景
出具证明编译器
自动定理证明技术
演示和总结
演示和总结
演示例子
单链表的创建和插入
总结
目标:构建经过验证的系统软件
出具证明编译和自动证明技术的结合
提高构建经过验证的系统软件的生产率
自动定理证明技术,特别是领域专用逻辑的自动定理证明技术方面是我们下一步的研究重点
逻辑的特点和证明策略、引理库构造
自动定理证明器的构造方法
自动定理证明器的生成技术
谢谢!请各位专家指正!