22
程序验证中的 自动定理证明技术研究 李兆鹏 中科大-耶鲁高可信软件联合研究中心 2009.12.12

程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

程序验证中的自动定理证明技术研究

李兆鹏

中科大-耶鲁高可信软件联合研究中心

2009.12.12

Page 2: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

提纲

研究背景

出具证明编译器

自动定理证明技术

演示和总结

Page 3: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

研究背景 1/2

携证明代码(Proof-Carrying Code)带来两方面挑战 类型或逻辑系统的研究 出具证明编译技术的研究

研究中心目标:构建经过验证的系统软件(Certified System Software)

研究中心目前开展的研究项目(部分) 操作系统内核验证 并行程序的编译与验证 出具证明编译器 自动定理证明技术研究 基于形状系统的支持指针程序验证

Page 4: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

研究背景 2/2

构造经过验证的软件的方法

带有标注的源程序

出具证明编译器

汇编代码证明

检查器

OS内核并行软件

手工验证

验证框架

Page 5: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

提纲

研究背景

出具证明编译器

自动定理证明技术

演示和总结

Page 6: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

出具证明编译器的研究 1/5

研究动机

连接源级验证与汇编级验证

源级验证更友好,报错更精确

汇编级验证被信任计算基础更小

某些模块必须用汇编语言来编码

提高经过验证的系统软件的生产率

编译技术

自动定理证明技术

Page 7: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

出具证明编译器的研究 2/5

相关工作:验证编译器(Certified Compiler) 经过形式化证明,输

出程序与输入源程序的可观察语义一致。

编译器(尤其是包含复杂优化后)验证困难大,编译器改动后需要重新证明。

验证编译器

源程序

汇编代码

证明

证明

程序规范

程序规范

Page 8: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

出具证明编译器的研究 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

验证条件(从前向后演算)

Page 9: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

出具证明编译器的研究 4/5

出具证明编译器

原型I(2006-2007)

PointerC出具证明编译器

标注的C程序(PointerC语言)

x86汇编代码证明

源级验证条件生成器

定理辅助证明 工具

Coq

证明翻译生成器

验证条件

证明

部分验证条件在Coq中手工证明

语言:C语言子集逻辑:指针逻辑

Page 10: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

出具证明编译器的研究 5/5

出具证明编译器

原型II(2008至今)标注的C代码

x86汇编代码证明

语言:C语言子集逻辑:分离逻辑

CComp出具证明编译器

源级验证条件生成器

VC证明翻译器与目标证明生成器

自动定理证明器

代码规模:~3.2万行SML代码~1.6万行Coq代码

Page 11: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明器 1/2

CComp出具证明编译器中的自动定理证明

线性整型定理证明器

待证明公式

分离逻辑定理证明器

其他领域专用证明器

自动定理证明器

证明记录 证明输出

证明(Coq可检查的证明项)

Page 12: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明器 2/2

线性整型定理证明器

基于Simplex决策过程

采用Coq的ZArith等库构造证明项

分离逻辑自动定理证明器

支持分离逻辑片段和内建谓词(list tree等)

构建了一个分离逻辑引理库以支持证明输出

自动定理证明技术是出具证明编译器的瓶颈

仅支持简单的程序和规范

仅支持简单的程序逻辑

Page 13: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

提纲

研究背景

出具证明编译器

自动定理证明技术

演示和总结

Page 14: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明技术 1/5

研究现状 微软研究院的Z3 (SMT solver)

支持多理论 自动,但仅输出Yes/No

证明辅助工具Coq/Isabelle等 需要交互完成(半自动) 可以输出证明项(Proof Term,lambda演算的项)

其他领域专用逻辑(Domain-Specific Logic)证明器 Smallfoot:简单命令式语言+分离逻辑片段上的检查器 jStar :Java子集+分离逻辑片段上的检查器 … 缺点:逻辑表达能力较弱、自动但不输出证明项

Page 15: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明技术 2/5

领域专用逻辑定理证明 验证中针对特定问题(如操作系统特定模块)设计

一种专用逻辑 避免设计一种通用逻辑(General Logic)的困难 更容易地实现自动证明

应用前景 构建经过验证软件的关键技术之一 提升出具证明编译器编译验证能力 应用于操作系统内核验证、并行程序验证 …

Page 16: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明技术 3/5

研究领域专用逻辑自动定理证明方法

正在开展的工作

分离逻辑等自动定理证明器

关键点和难点:

设计证明策略库、引理库是本研究的关键

设计自动搜索证明路径的算法

输出简洁的证明项是一个难点

将要开展的工作

基于形状图指针程序验证条件自动证明器

Page 17: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

基于形状系统的指针程序验证系统

形状系统

源代码级的验证

引入形状描述,标注变量对应的形状

支持常规的数据结构:单链表、双链表、树等

支持复杂数据结构指针程序的验证

推断前后条件、循环不变式

GNU C Library请求队列与就绪队列

Page 18: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明技术 4/5

研究产生简洁证明项的一般方法 研究动机

目前自动定理证明器不输出严格的证明项

证明项是PCC代码包的重要组成

在编译过程中很难对复杂的证明项进行向下“编译”

正在开展的工作 通过构建、优化引理库和策略库,简化证明项

关键点和难点 抽取常用的性质证明作为引理

把握证明项和策略序列的灵活使用

证明项形式兼顾出具证明编译器后端的使用是一个难点

Page 19: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

自动定理证明技术 5/5

研究从领域专用逻辑的描述生成自动定理证明的方法

长期目标

用户提供逻辑的描述

断言语言、逻辑规则、部分引理和策略

设计并实现一种工具来生成自动定理证明器

如同利用Yacc来生成编译器的语法分析器一样

难点:如何判断给定策略是否可行、充足

Page 20: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

提纲

研究背景

出具证明编译器

自动定理证明技术

演示和总结

Page 21: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

演示和总结

演示例子

单链表的创建和插入

总结

目标:构建经过验证的系统软件

出具证明编译和自动证明技术的结合

提高构建经过验证的系统软件的生产率

自动定理证明技术,特别是领域专用逻辑的自动定理证明技术方面是我们下一步的研究重点

逻辑的特点和证明策略、引理库构造

自动定理证明器的构造方法

自动定理证明器的生成技术

Page 22: 程序验证中的 自动定理证明技术研究lcs.ios.ac.cn/~zj/20091212/LiZhaoPeng_USTC.pdf · 研究背景1/2 携证明代码(Proof-Carrying Code)带来两方面 挑战 类型或逻辑系统的研究

谢谢!请各位专家指正!