程序验证工具的研究 中国科学技术大学 陈意云

Slides:



Advertisements
Similar presentations
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
Advertisements

第7章 樹與二元樹 (Trees and Binary Trees)
“淡雅浓香 中国风尚” 山东低度浓香白酒整合传播侧记
可信软件的前沿理论和技术 计算机科学与技术学院 中科大-耶鲁高可信软件联合研究中心 邵中、陈意云、张昱、郭宇、李兆鹏等
Tool Command Language --11级ACM班 金天行.
2012大華技術學院推廣教育中心舉辦 歡樂夏令營 洽詢專線:(03) 分機:2357或2523 梯次 日期 課 程 名 稱
第三章 鏈結串列 Linked List.
Oracle数据库 Oracle 子程序.
对程序进行推理的逻辑 计算机科学导论第二讲
第8章 查找 数据结构(C++描述).
程序的形式验证 - 简介 中国科学院软件研究所 张文辉 1.
Linked List Operations
Hadoop I/O By ShiChaojie.
第7章:文件共享 与远程控制——回顾 第8章:bash脚本编程 本章教学目标: 了解shell程序的基本结构 网络文件系统NFS的概念
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
第12章 樹狀搜尋結構 (Search Trees)
形状图逻辑和形状系统 中国科学技术大学 报告人 陈意云
计算机科学技术系 陈意云 程序分析与程序验证 计算机科学技术系 陈意云
(Circular Linked Lists)
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
临界区软件互斥软件实现算法.
Windows网络操作系统管理 ——Windows Server 2008 R2.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
What have we learned?.
第二章 Java语言基础.
临界区软件互斥软件实现算法 主讲教师:夏莹杰
泛型委托 泛型接口、方法和委托.
資料結構 第4章 堆疊.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
排列组合 1. 两个基本原理 分类加法计数原理 分步乘法计数原理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第7章 程序验证 内容概述 程序逻辑:描述和论证程序行为的逻辑 从程序到定理 从定理到证明 循环不变式的推断
λ演算与函数式设计语言 有以下函数: Y = λg.((λf.g(f f)) (λf .g(f f)))
无向树和根树.
第4章 PHP流程控制语句.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
C# 入门 2011级ACM班 张方魁.
$9 泛型基础.
顺序表的删除.
第三节 常见天气系统.
VisComposer 2019/4/17.
第二章 Java基本语法 讲师:复凡.
第7章 樹與二元樹(Trees and Binary Trees)
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
第 四 讲 线性表(二).
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
College of Computer Science & Technology
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
#define RBTREE_RED 0 #define RBTREE_BLACK 1 typedef int dataType; typedef struct treeNode{ dataType key; int color; //red:0.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
定义21.17:设P1=P(Y1)和P2=P(Y2),其个体变元与个体常元分别为X1,C1和 X2,C2,并且或者C1=或者C2。一个半同态映射(,):(P1,X1∪C1)→(P2,X2∪C2)是一对映射: P1→P2; : X1∪C1→X2∪C2,它们联合实现了映射p(x,c)→(p)((x),
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
基于列存储的RDF数据管理 朱敏
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
插入排序的正确性证明 以及各种改进方法.
本节内容 1. 平衡二叉树的定义 2.平衡化旋转 3.平衡二叉排序树的插入操作 昆山爱达人信息技术有限公司
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

程序验证工具的研究 中国科学技术大学 陈意云 0551-3607043 yiyun@ustc.edu.cn http://staff.ustc.edu.cn/~yiyun

报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 通过一个简单例子了解概念和工作流程 函数前后条件、循环不变式、 Hoare逻辑的赋值公理,最弱前条件演算、验证条件的生成、验证条件的证明 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示

一类程序验证器的工作原理 例子:用加运算来实现乘运算的函数 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { x = x + m ; y = y + 1 ; } 例子:用加运算来实现乘运算的函数

一类程序验证器的工作原理 由程序员提供 由程序员提供 n  0 - - 前条件 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { x = x + m ; y = y + 1 ; } } x = m  n - - 后条件 由程序员提供 由程序员提供

一类程序验证器的工作原理 也由程序员提供 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) - - 循环不变式 x = x + m ; y = y + 1 ; } } x = m  n 也由程序员提供

一类程序验证器的工作原理 函数前后条件、循环不变式 都称为断言 它们看上去像编程语言的布 尔表达式 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) - - 循环不变式 x = x + m ; y = y + 1 ; } } x = m  n 函数前后条件、循环不变式 都称为断言 它们看上去像编程语言的布 尔表达式

一类程序验证器的工作原理 Hoare逻辑赋值公理: { Q[E/x] } x = E { Q } n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) x = x + m ; y = y + 1 ; } } x = m  n Hoare逻辑赋值公理: { Q[E/x] } x = E { Q } 例子: { ? } x = x +1 { x > 6 } { x > 5 } x = x +1 { x > 6 } x > 5是  赋值x = x +1, 和  后条件x > 6 的最弱前条件

一类程序验证器的工作原理 从后向前进行最弱前条件演算,产生验证条件 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) x = x + m ; y = y + 1 ; } } x = m  n 从后向前进行最弱前条件演算,产生验证条件

一类程序验证器的工作原理 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) x = x + m ; y = y + 1 ; } ((x = my)  (y  n))  (y < n) // 循环结束程序点的断言 } x = m  n

一类程序验证器的工作原理 第1个验证条件 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) x = x + m ; y = y + 1 ; } ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n 第1个验证条件

一类程序验证器的工作原理 通过最弱前条件演算得到 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) x = x + m ; (x = m(y+1))  ((y+1)  n) y = y + 1 ; } (x = my)  (y  n) ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n 通过最弱前条件演算得到

一类程序验证器的工作原理 n  0 function mult(m, n) { x = 0 ; y = 0 ; while y < n do { (x = my)  (y  n) (x+m = m(y+1))  ((y+1)  n) x = x + m ; (x = m(y+1))  ((y+1)  n) y = y + 1 ; } (x = my)  (y  n) ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n

一类程序验证器的工作原理 第2个验证条件 n  0 function mult(m, n) { x = 0 ; y = 0 ; ((x = my)  (y  n))  (y < n)  (x+m = m(y+1))  ((y+1)  n) while y < n do { (x = my)  (y  n) (x+m = m(y+1))  ((y+1)  n) x = x + m ; (x = m(y+1))  ((y+1)  n) y = y + 1 ; } (x = my)  (y  n) ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n 第2个验证条件

一类程序验证器的工作原理 n  0 function mult(m, n) { x = 0 ; (x = m0)  (0  n) y = 0 ; ((x = my)  (y  n))  (y < n)  (x+m = m(y+1))  ((y+1)  n) while y < n do { (x = my)  (y  n) (x+m = m(y+1))  ((y+1)  n) x = x + m ; (x = m(y+1))  ((y+1)  n) y = y + 1 ; } (x = my)  (y  n) ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n

一类程序验证器的工作原理 n  0 function mult(m, n) { (0 = m0)  (0  n) x = 0 ; (x = m0)  (0  n) y = 0 ; ((x = my)  (y  n))  (y < n)  (x+m = m(y+1))  ((y+1)  n) while y < n do { (x = my)  (y  n) (x+m = m(y+1))  ((y+1)  n) x = x + m ; (x = m(y+1))  ((y+1)  n) y = y + 1 ; } (x = my)  (y  n) ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n

一类程序验证器的工作原理 第3个验证条件 n  0 function mult(m, n) { ( n  0 )  ((0 = m0)  (0  n)) (0 = m0)  (0  n) x = 0 ; (x = m0)  (0  n) y = 0 ; ((x = my)  (y  n))  (y < n)  (x+m = m(y+1))  ((y+1)  n) while y < n do { (x = my)  (y  n) (x+m = m(y+1))  ((y+1)  n) x = x + m ; (x = m(y+1))  ((y+1)  n) y = y + 1 ; } (x = my)  (y  n) ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n 第3个验证条件

一类程序验证器的工作原理 由自动定理证明器完成验证条件的证明 n  0 function mult(m, n) { ( n  0 )  ((0 = m0)  (0  n)) x = 0 ; y = 0 ; ((x = my)  (y  n))  (y < n)  (x+m = m(y+1))  ((y+1)  n) while y < n do { (x = my)  (y  n) x = x + m ; y = y + 1 ; } ((x = my)  (y  n))  (y < n)  (x = mn) } x = m  n 由自动定理证明器完成验证条件的证明

一类程序验证器的工作原理 程序验证器小结 1、程序员 为各函数写函数前后条件 为各循环写循环不变式 2、程序验证器 为各函数产生验证条件(通过从前向后的演算或从后向前的演算) 证明所产生的验证条件(使用自动定理证明器)

报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高断言语言的表达能力 解决各种数据类型带来的特殊问题 解决非结构化控制结构带来的问题 … … 提高自动定理证明器的能力 提高程序验证能力的思路 一个程序验证系统原型演示 19

提高断言语言的表达能力 例1:表达数组a[100]的有序性 例2:表达单链表的有序性 可以在语言布尔表达式语法的基础上引入量词 i:0..98. a[i] <= a[i+1] 例2:表达单链表的有序性 用量词的方式 n:Z.i:0..n-2. p(->next)i->data <= p(->next)i+1->data 用归纳谓词的方式 SortedList(p)  p == NULL || p->next == NULL || p->data <= p->next->data && SortedList(p->next) 20

提高断言语言的表达能力 例3:表达二叉排序树的有序性 用归纳谓词的方式 Gt(x, p)  p == NULL || x > p->data && Gt(x, p->left) && Gt(x, p->right) Lt(x, p)  p == NULL  x < p->data && Lt(x, p->left) && Lt(x, p->right) Bst(p)  p == NULL  Bst(p->left) && Bst(p->right) && Gt(p->data, p->left) && Lt(p->data, p->right) 用量词方式较难定义 21

提高断言语言的表达能力 例4:断言语言需要更加复杂扩展的例子 断言语言越复杂,生成的验证条件就复杂,验证条件的自动证明就越困难 程序不会出现内存泄漏 程序不会对dangling指针进行dereference操作 在任何时候,最多只有一个进程处于临界区(安全性) 只要进程请求进入临界区,则最终会被允许进入(活性) 断言语言越复杂,生成的验证条件就复杂,验证条件的自动证明就越困难 22

解决各种数据类型带来的特殊问题 以指针类型为例 指针别名 先前提到的无内存泄漏等 最终也导致对自动定理证明器有较高期望 { A } x = 5 { x + y == 10 } 按Hoare逻辑的赋值公理 A = (x + y == 10) [5/x] = 5 + y == 10 = y == 5 实际上最弱前条件A应该是:x == y || y == 5 先前提到的无内存泄漏等 最终也导致对自动定理证明器有较高期望 23

解决非结构化控制结构带来的问题 Hoare逻辑对结构化语句的推理规则 循环体中的break语句和continue语句 推理规则不会像上述规则这样简洁 {P} S1 {R} {R} S2 {Q} {P} S1; S2 {Q} {PE} S {P} {P} while E do S {PE} {PE} S1 {Q} {PE} S2 {Q} {P} if E then S1 else S2 {Q} 24

报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高断言语言的表达能力 解决各种数据类型带来的特殊问题 解决非结构化控制结构带来的问题 … … 提高自动定理证明器的能力 提高程序验证能力的思路 一个程序验证系统原型演示 25

报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 程序员提供对验证有帮助的提示 提高合法程序的门槛 用程序分析获得的信息来支持程序验证 … … 一个程序验证系统原型演示 26

程序员提供对验证有帮助的提示 方式1:程序员声明数据结构的形状 给程序员带来好处 typedef struct node{Node* : LIST next; int data;} Node; typedef struct node{Node*:TREE left; Node* :TREE right; int data;}Node; 给程序员带来好处 免除提供有关数据结构形状的函数前后条件 免除提供有关形状的循环不变式 帮助检查引起内存泄漏的操作 帮助检查对NULL指针和dangling指针的dereference操作 27

程序员提供对验证有帮助的提示 方式2:提供数据结构的性质定理 删除二叉排序树根节点的函数 通过循环,找到左子树的最右叶节点,取它的数据作为根节点数据,删除该最右叶节点 函数的前条件是 p!=NULL  Bst(p) 函数的后条件式是 Bst(p) 从Bst(p)等谓词定义, 基于演绎推理, 推不出性质:绿色节点是左子树上最大 但又小于根的节点 … … … p 28

程序员提供对验证有帮助的提示 方式2:提供数据结构的性质定理 好处:减轻了自动定理证明器的负担 那是一个需要归纳证明的性质 Gt(x, p)  p == NULL || x > p->data && Gt(x, p->left) && Gt(x, p->right) Lt(x, p)  p == NULL  x < p->data && Lt(x, p->left) && Lt(x, p->right) Bst(p)  p == NULL  Bst(p->left) && Gt(p->data, p->left) && Bst(p->right) && Lt(p->data, p->right) 那是一个需要归纳证明的性质 程序员在给出Bst等谓词定义时, 还需要给出程序用到的性质定理 好处:减轻了自动定理证明器的负担 … … … p 29

提高合法程序的门槛 方法1:给编程语言设计一个形状系统 排除不符合形状系统规定的程序,类似于类型检查 单链表指针h作为函数的实参  nxt . . . m个节点, m>=0 允许作为实参 指向它的是NULL指针 30

提高合法程序的门槛 方法1:给编程语言设计一个形状系统 排除不符合形状系统规定的程序,类似于类型检查 单链表指针h作为函数的实参  nxt . . . m个节点, m>=0 允许作为实参 h D nxt . . . m个节点, m>=0 不允许作为实参 指向它的是dangling指针 31

提高合法程序的门槛 方法1:给编程语言设计一个形状系统 排除不符合形状系统规定的程序,类似于类型检查 单链表指针h作为函数的实参  nxt . . . m个节点, m>=0 允许作为实参 h D nxt . . . m个节点, m>=0 不允许作为实参 h不允许作为实参 p允许作为实参 h  nxt . . . m个节点, m > 0 p n个节点, n >0 32

提高合法程序的门槛 方法1:给编程语言设计一个形状系统 排除不符合形状系统规定的程序,类似于类型检查 一个双向链表 h  r . . . l 一个双向链表 循环迭代依次把域l都赋值为NULL,然后当单链表用 h  r . . . l 形状系统拒绝这个程序,因为它偏离了声明的形状 33

提高合法程序的门槛 方法1:给编程语言设计一个形状系统 好处: 其他方法,例如 有助于自动推断有关形状的循环不变式 减轻自动定理证明器的负担 对有些类型的运算加以限制:有控制地使用指针算术运算和类型强制等 减少非结构化的控制流 34

用程序分析来支持程序验证 方法:先程序分析,后程序验证 用特定程序分析获取的信息来支持随后的程序验证 例如 { p->data == 10 } p1->nxt->data = p->data + 5 { ? } 取决于p1->nxt是否等于p。若不知道,则需要考 虑两种情况,因而后条件是: p1->nxt != p  (p->data == 10  p1->nxt->data == 15)  p1->nxt == p  p->data == 15 若先指针分析,得到指针相等信息,则大大简化 35

用程序分析来支持程序验证 方法:先程序分析,后程序验证 用特定程序分析获取的信息来支持随后的程序验证 例如 { p->data == 10 } p1->nxt->data = p->data + 5 { ? } h  nxt . . . m个节点, m>=0 p1 p n个节点, n>=0 36

用程序分析来支持程序验证 方法:先程序分析,后程序验证 用特定程序分析获取的信息来支持随后的程序验证 例如 { p->data == 10 } p->data = p->data + 5 { ? } h  nxt . . . m个节点, m>=0 p1 p n个节点, n>=0 37

用程序分析来支持程序验证 方法:先程序分析,后程序验证 用特定程序分析获取的信息来支持随后的程序验证 例如 { p->data == 10 } p->data = p->data + 5 {p->data == 15 } h  nxt . . . m个节点, m>=0 p1 p n个节点, n>=0 38

报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 程序员提供对验证有帮助的提示 提高合法程序的门槛 用程序分析获得的信息来支持程序验证 … … 一个程序验证系统原型演示 39

报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 报 告 提 纲 一类基于逻辑推理的程序验证器的工作原理 面向实际程序验证需要解决的问题 提高程序验证能力的思路 一个程序验证系统原型演示 40

一个程序验证系统原型演示 特点 已经能验证 研究指针程序验证的一个成果,还在扩展完善中 为操作易变数据结构的指针程序设计了一种专用的形状图逻辑,设计了形状系统 先形状分析,后程序验证 已经能验证 演示:快速排序程序(数组程序)、二叉排序树的插入函数(递归),二叉排序树的删除函数(循环)和树堆(treap) 还有:伸展树(splay tree),平衡树(AVL tree) 和 AA tree等 41

谢 谢 !