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

一、克雷格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]等等。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

q1uTruth

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

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

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

打赏作者

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

抵扣说明:

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

余额充值