程序形式化验证之——谓词抽象技术

本文深入探讨了谓词抽象的概念,包括克雷格插值和归纳序列插值在矛盾分析中的作用。它强调了抽象和反例在程序验证中的重要性,并解释了如何通过谓词抽象和精化(Refinement)过程来处理伪反例。同时,文章提到了优化谓词抽象的策略,如初始谓词集合的选择和轻量级不变式生成。此外,还讨论了在不同修复场景中,谓词抽象与模型抽象的异同以及反例判定算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、克雷格Craig二元插值 & 归纳序列插值

注意点

● A和B插值I表达的是A的一些关键性质,正是因为这些性质才使A与B矛盾(因为A与B为FALSE)。插值I抽象掉了A中与导致矛盾无关的部分(I与B为FALSE说明插值是A中抽象出的冲突部分)。使用I来表示和该路径有相似原因导致属性不可达的路径集合,从而实现泛化,使我们能分析更多的路径。

● 二元插值中的A,序列插值中的F可以是状态机中的一个状态,也可以是例如C程序的几条执行语句组成的程序基本块(lock = true; old= new)

● 谓词运算的含义 及 两个特殊谓词(永真和永假)

● n个谓词 对应 n-1个插值


解释说明

在这里插入图片描述


在这里插入图片描述




二、命题 和 谓词 的区别和联系

命题:可以判断真伪的陈述句

● 比如命题P:小明是学生
● 复合命题Q:如果明天下雨,那么我不出门

谓词:引入了个体,扩展了命题

● P无法描述小明,而谓词P(x):x是学生解决了这一问题
● 谓词用于描述个体属性或个体之间的关系
● 谓词只有在指定个体值时才是谓词
● 一个命题的谓词表达不唯一




三、抽象的几个重要概念

重要概念

抽象域的定义:谓词抽象的抽象域是谓词
抽象状态标记的定义
抽象后记算子的作用:谓词抽象的抽象算子是最弱前置条件判断霍尔三元组是否成立
抽象后继的定义
● 整个计算过程都在抽象空间进行而不涉及程序的实际运行状态,从而提升计算效率
● 博客里没解释定义的抽象状态空间


基本流程

设定抽象域,将各程序节点使用抽象域中的元素进行标记,形成抽象状态(当前程序状态的上近似),通过抽象后继算子计算抽象后继,整个计算过程都在抽象空间中进行


解释说明

在这里插入图片描述


在这里插入图片描述




四、谓词抽象

基本抽象流程

● 设定抽象域,初始谓词集合为分支里的谓词,第一个节点的抽象状态为true,将各程序节点使用抽象域中的元素进行标记,形成抽象状态(当前程序状态的上近似),通过抽象后继算子(谓词抽象中是最弱前置条件)计算抽象后继

● 整个计算过程都在抽象空间中进行。采取深度优先的策略,遇到分支会先完成一个分支,直到达到断言处assert。以下情况不需要再使用抽象后继算子推抽象后继:如果新抽象状态包含在抽象状态中,这条环路的计算已经收敛,达到不动点,我们也无需继续计算。已经收敛,达到不动点,我们也无需继续计算。直到计算路径被阻塞,或者被之前的同名结点覆盖。

基本Refine流程

● 由于伪反例的存在,导致我们无法使用当前的抽象空间,来证明程序的正确性。 这代表我们抽象得太过了,我们需要依据得到的伪反例,对当前抽象空间进行修正,使其抽象粒度变小,从而排除伪反例。 我们称这一修正过程称为精化(Refined)

● 伪反例判定算法 SMT
实际上是一条抽象空间里的伪反例(是一条抽象状态空间下的反例),不是程序的实际执行路径。
谓词抽象状态空间是上近似空间,所以在抽象空间找出的错误路径不一定准确,可能并不属于程序的实际行为。

● 伪返利消除(Refine)算法:
对于谓词抽象而言,由于其抽象空间是由谓词集合生成的,所以其精化的方式就是在谓词集合中通过克雷格插值加入新谓词。排除插值中已经出现的谓词

CEGAR是一种思想而不是和谓词抽象等价?

在精化完成后,需要能够在精化后抽象空间中消除对应的伪反例路径。

通过向谓词集合中加入插值生成的新谓词,我们能够消除对应的伪反例路径么?




五、对比修复场景

● 输入的属性不同:一个为正,一个为反

● 抽象的目的相同:都是当前空间不好表达

● 抽象模型检测:一个用正一个用反

● 模型抽象方式不同:一个是谓词抽象且是上近似,一个是抽象空间由fi决定,规则语义和配置抽象,好像不是上近似但是改变了状态空间
● 但是模型抽象目的都相同:抽象状态空间

● 伪反例判定算法(本质也是反例分析)不同:一个SMT,一个智能家居场景的新算法
如果判定为真反例:一个为bug,一个为可用的fix
如果判定为伪反例:则进行抽象refine算法
如果未找到任何反例:一个为安全,一个为不存在可行的fix
● 伪反例判定算法除了general还有platform-specific:
% 在解空间包含的修复信息中,我们总结了如下三类包含虚伪修复信息的智能家居规则交互情景:1)相关规则并不是每次交互都存在漏洞。“正常规则执行情况”在与当前缺陷规则的交互情况无关的其它规则交互情况中也存在,但是它们对当前漏洞的修复没有作用(对应着general的不是程序实际执行路径);2) 在与当前缺陷交互相关的规则交互中,通过改变人为无法控制的(uncontrollable)自然属性来制造“正常规则执行情况”是虚伪的,例如下雨时窗户打开的漏洞情况,如果将此时的天气变为不下雨就能消除漏洞,但是下雨并不是家居系统能控制的(platform-specific),例如;3)由于漏洞不会完全影响后续规则的正常执行,即使没有消除当前抽象空间的漏洞/当前漏洞仍存在(即虚伪),与当前缺陷规则交互情况相关的后续规则交互情况中也存在“正常规则执行情况”(platform-specific);
● 但是伪反例的解释都相同:由于是抽象后的空间,这个在抽象空间里符合规定的反例不一定准确,可能并不属于程序的实际行为 / 不对应目前的缺陷情况。

● 抽象refine算法不同:一个是插值,一个是invarient / 一个是find assign & step和init
● 目的都相同:都是根据,对当前抽象空间进行修正 / 调整,从而消除对应的伪反例。由于伪反例的存在,导致我们无法使用当前的抽象空间,来证明程序的正确性。 这代表我们抽象得太过了 / 抽象的层次不对,我们需要依据得到的伪反例,对当前抽象空间进行修正 / 调整,使其抽象粒度变小,从而排除伪反例。 我们称这一修正过程称为精化(Refined)




六、谓词抽象的优化

关于谓词抽象算法,还有很多进一步优化的空间。 比如说,我们可以获取程序中的谓词(if语句和while语句的条件)来作为初始的谓词集合,以减少分析的迭代次数。 我们也可以使用一些轻量级的不变式生成技术(区间分析),来生成辅助不变式作为谓词,以加快迭代。

目前已有大量的研究工作来优化谓词抽象,其中最为知名的应该是惰性抽象(Lazy Abstraction)[2]。 此外,还有大块编码(Large Block Encoding)以及可调块编码(Adjustable Block Encoding)[3]等等。

Model checking is a technique for verifying finite state concurrent systems such as sequential circuit designs and communication protocols. It has a number of advantages over traditional approaches that are based on simulation, testing, and deductive reasoning. In particular, model checking is automatic and usually quite fast. Also, if the design contains an error, model checking will produce a counterexample that can be used to pinpoint the source of the error. The method, which was awarded the 1998 ACM Paris Kanellakis Award for Theory and Practice, has been used successfully in practice to verify real industrial designs, and companies are beginning to market commercial model checkers. The main challenge in model checking is dealing with the state space explosion problem. This problem occurs in systems with many components that can interact with each other or systems with data structures that can assume many different values. In such cases the number of global states can be enormous. Researchers have made considerable progress on this problem over the last ten years. This is the first comprehensive presentation of the theory and practice of model checking. The book, which includes basic as well as state-of-the-art techniques, algorithms, and tools, can be used both as an introduction to the subject and as a reference for researchers. About the Authors Edmund M. Clarke, a pioneer of the automated method called Model Checking, is FORE Systems Professor of Computer Science and Professor of Electrical and Computer Engineering at Carnegie Mellon University, and a winner of the 2007 Turing Award given by the Association for Computing Machinery. Doron Peled is Professor of Computer Science at the University of Warwick, Coventry, UK. Endorsements "Model Checking is bound to be the pre-eminent source for research, teaching, and industrial practice on this important subject. The authors include the foremost experts. This is the first truly comprehensive treatment of a line of research that has gone from conception to industrial practice in only two decades." —R. P. Kurshan, Distinguished Member Technical Staff, Bell Laboratories
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q1uTruth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值