模型检测原理、方法学习

模型检测学习

一、模型检测概论

1.1 模型检测所解决的问题:保证并发系统正确性和可靠性
1.2 特点:自动化程度高、简洁明了
1.3 发展:用于描述并发系统性质的CTL逻辑 符号模型检测技术
1.4 基本思想
用状态迁移系统(S)表示系统的行为,用模态/时序逻辑公式(F)描述系统的性质,这样“系统是否具有所期望的性质”就转化为数学问题“状态迁移系统 S 是否是时序逻辑公式 F 的一个模型?”,这个问题是可判定的,即可以用计算机程序在有限时间内自动确定。在这里插入图片描述
1.5模型检测过程
(1)建模:第一个步骤是把设计转化为被模型检测工具接受的形式;可能由于验证时间和计算机内存的限制,还需要使用抽象技术简约不相关或不重要的细节。
(2)刻画(规约):声明设计必须满足的性质。性质刻画通常以某种逻辑的形式(如时序逻辑,这种逻辑体系表示系统随着时间的变化)表示。(用一种逻辑形式来刻画一个性质)
(3)验证:理想上的验证应该是完全自动的。但实际上常常需要人的帮助,其中之一就是分析结果。当得到失败结果后,通常可以给用户提供一个错误轨迹,可以把它看作检测性质的一个反例,使设计者可以跟踪错误发生的具体位置
在这里插入图片描述

二、系统建模

2.1基于中间建模

基于中间建模语言,将实际程序语言编写的程序转换为一个中间模型,可以重用模型检查算法,使程序模型检查框架具有更好的扩展性。
Example
Fearer /MODEX的目标是将程序的实现级描述(C语言)转换到经典模型检查器spin的验证模型,模型检查器 spin的建模语言是Promela。Feaver/MODEX将源程序的控制流结构表示为Promela语言的控制流结构,用Promela新定义的嵌入原语将源程序中数据声明和基本语句嵌入到验证模型中。

2.2 直接生成验证模型

直接生成验证模型:程序模型检查中,对代码的任何修改、变换都可能导致假报错,或者错误遗漏;模型检查中触发的实际代码越多,可以发现的错误越多。从被检查的源程序中直接生成验证模型,可以有效避免上述问题。
Example:
NASA Ames的JPF2直接处理程序的中间码而不是源程序本身绕开了复杂的源语言结构
CMU的MAGIC在生成模型之前对源程序进行了抽象等变换,以减小检查程序的规模
斯坦福大学的CIVIC用实际(模拟)执行方法得到所需的验证空间
NASA Ames的JPF-SE扩展JP2实现符号执行
CMU的CBMC将源程序直接编码为一个等式系统。

2.3 建模示例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、模型逻辑的种类

3.1计算树逻辑

在这里插入图片描述

在这里插入图片描述
1、原理:一个系统的运行可以看成系统的转态变化,并发系统因为行为不确定性可以有多个可能的后续状态,所以可以产生一颗状态树。
2、描述类型:状态前后关系和分支情况
公式组成:原子命题、逻辑连接符( not,or,and 等)、模态算子(E(Exists), A( Always), X
(Next-time), U(Until), F(Future), G( Global))
3、E表示对于某一个分枝, A表示对于所有分枝,X表示下一状态, U表示直至某一状态, F表示现在或以后某一状态, G表示现在和以后所有状态
4、前两个算子描述分枝情况,后四个算子描述状态的前后关系.
5、CTL中描述分枝情况和描述状态的前后关系的算子成对出现,即一个描述分枝情况的算子后面必须有一个描述状态的前后关系的算子"
6、产生规则:原子命题是CTL 公式;如果p,q 是CTL 公式,则not p,p or q,p and q, EX p,E(pU q),EF p,EG p,AX p,A(p U q),AF p,AG p 是CTL 公式。
7、时间复杂度:对CTL 公式存在线性时间的模型检测算法,即算法的最坏时间复杂度与|S||F|成正比,这里|S|是状态迁移系统的大小,|F|是逻辑公式的长度。
8、四种常见的CTL运算符
在这里插入图片描述
9、示例
以进程访问共享数据为例,假设有两个进程proc1和proc2,当进入“critical”状态表示正在访问共享数据,“entering”状态表示进程请求访问共享数据,当任务调度允许访问后进入“critical”状态访问共享数据。

性质1:不存在进程1和进程2同时进入“critical”状态
对应的CTL:AG ! (proc1.state = critical & proc2.state = critical)

性质2:如果进程1处于“entering”状态(即请求进入“critical”状态),那么最终进程1都会进入“critical”状态
对应的CTL:AG (proc1.state = entering -> AF proc1.state = critical)

3.2 命题线性时序逻辑

1、原理:系统状态变化的可能性可以看成是一种树状结构同时 它又可以看成是所有可能的系统初始状态经历各种可能变化的集合,也就是把一颗树看成是有限或无限条路径的集合,一 条路径所代表的是系统的一次可能的运行情况"
2、描述类型:系统的任意一次运行中的状态以及它们之间的关系
公式组成:原子命题、逻辑连接符(非或与)、模态算子 ◇(Eventually),□(Always)。◇表示现在或以后某一状态(类似CTL 的F), □表示现在和以后所有状态(类似CTL 的G)
3、产生规则:原子命题是PLTL 公式;如果p,q 是PLTL 公式,则not p,p or q,p and q, ◇p,□p 是PLTL 公式。
在这里插入图片描述
4:示例
性质:信号灯不能在同一时间出现两种以上的颜色
对应的PLTL: □( ¬(gr∧ye) ∧ ¬(ye∧re) ∧ ¬(re∧gr) ∧ (gr v ye v re) )

3.3 μ-演算(面向动作)

原理:系统状态的改变总是某种动作引起的,μ-演算关心的是系统的动作与状态之间的关系描述动作的基本元素是动作符号
组成:μ-演算公式由原子命题,命题变量,逻辑连接符,模态算子和不动点算子组成。逻辑连接符包括:not,or,and。模态算子:对于每个动作符号a,有两个模态算子[ a ]和< a >。[ a ]表示对所有的a 动作, < a >表示对某个a 动作。不动点算子有最小不动点算子μ和最大不动点算子v。
产生规则:原子命题和命题变量是μ-演算公式;如果p,q 是μ-演算公式,则not p,p or q,p and q,[ a ]p,< a >p,μX.p,vX.p 是μ-演算公式。
μ演算的缺点是不易读懂,优点是表示能力强,CTL和LTL可以嵌入到它的真子集中,并且具有和相应的CTL和LTL相同的复杂度的模型检测算法,因此一般将μ-演算作为模型检测的一般框架加以研究。

四、模型检测的方法

爆炸问题概念:模型检测基于对系统状态空间的穷举搜索,对于并发系统, 其状态的数目往往随并发分量的增加呈指数增长,因此当一个系统的并发分量较多时,直接对其状态空间进行搜索在实际上是不可行的,这就是所谓的状态爆炸问题。
为了有效应用模型检测方法,就要研究减少和压缩空间状态的方法,以增加效率和减少内存空间的需求,比如符号模型检测、偏序规约、对称模型检测等
或者是减少模型本身或者验证性质的复杂性,比如说抽象技术、程序切片和模型分解等

4.1 符号模型检测

1、基本原理:系统的状态转换关系用逻辑公式表示,主要基于布尔公式,所以称为符号化模型检测,可以采用二叉判定图或采用二元决策图OBDD来符号化地表示有限状态反应系统,它能较为紧凑地表示状态转换关系,以降低系统模型所需的内存空间。
2、示例
布尔公式
二叉判定图
真值表
3、OBDD化简规则
规则1(S-删除规则)对于OBDD中的节点u,如果u.low=u.high,则删除节点u,并将节点u的父节点直接连接至u.low所对应的节点。
**规则2(合并规则)**对于OBDD中的节点u和v,如果u.var =v.var、u.low =v.low 且u.high =v.high,则删除节点u,并将节点u的父节点直接连接至节点v。

在这里插入图片描述
在这里插入图片描述
原二叉判定图:
在这里插入图片描述
化简叶节点:
在这里插入图片描述
化简子节点:
在这里插入图片描述
最后结果:
在这里插入图片描述
OBDD作为布尔公式的一个规范的表示形式,比一般的传统公式如析取公式和合取公式更加紧凑,而且操作起来效率更高,对于一个给定的布尔公式和给定的变量顺序,将得到唯一的OBDD。
因为OBDD在获取有限域上简洁的关系表达式时非常的方便,符号模型检测方法采用OBDD表示状态集合及其转换关系的特征函数。

4.2 偏序简约

原理:减少系统模型中的状态数目,来降低模型检测算法所搜索的状态空间规模,并且保证被验证性质在精简模型上的正确性。主要面对的是具有并发、异步特点的模型。这种模型的并发、异步的特点使此模型的行为交替运行,其顺序往往不能被性质规范所识别。因此,在考虑模型状态空间时,必须要考虑到所有执行顺序的交替可能性,而“所有”的状态在实际中往往就组成不可处理的“爆炸状态空间"。
依据:可并发执行的变迁关系具有交换性,当它们以不同的顺序执行时,都会达到统一状态(只应用于异步系统)
过程:使用改进的DFS算法(深度优先搜索算法)改造图生成约简状态图,约简过程将构建一个状态和边数量都更少的图,这样不但能使用更少的内存,还能加速图的构建过程,最终提高模型检测算法的效率。
最后模型检测算法就在约简状态图上进行。

4.3对称模型检测

原理:由多进程组成的某些进程可能完全类似,并发执行的结果可能产生许多相同或者相似的路径##,所以可以只搜索在对称关系中等价的一种情形,避免重复搜索对称或者相同的系统状态

4.4 抽象

抽象的基本方法是抽掉系统中的细节、用尽可能少的状态来刻画系统的动作过程。如下图所示,把一堆状态简化为一个状态。原来系统称为具体系统,而简化了的系统称为抽象系统。抽象系统能够保持具体系统的许多性质,但也会丢失某些性质。
类型:
1、我们将很多有共性的精确的数据和抽象数据间建立一个映射关系,这样,一个抽象数据就可以表示所有拥有此共性的数据的集合,这样就有效的减少了可能存在的数据值,减少了状态空间
2、状态合并,此方法通过删除很多不会影响检验性质的状态,即精减“所有"状态为必然有效的状态,达到有效减少状态空间的作用。
在这里插入图片描述

4.5 程序切片

将程序中不影响所要验证的性质的语句去掉以减少模型复杂性

4.6 模型分解

将一个模型分解成若干部分,或者分别验证,或者提供一个讲好的组合方法以降低验证的复杂性。同样的一个需要验证的性质也可以分解成若干部分,然后分别验证。

五、验证方法

SAT 求解器

SAT问题:可满足性问题(Boolean satisfiability problem, SAT 问题)它来自布尔真值判定问题. 给定一组布尔变量 V{a,b,c….} 和一组由 V 描述的合取范式 F, 判断是否存在一个关于X的真值赋值S(X),使得 F(x)为真,如果存在则称 F(X)是 可满足的,否则称 F(X)是不可满足的
SAT算法:给定一 个 SAT 问题公式 F (X),在有限的时间内判定其是否可满足的算法称为 SAT求解算法,典型的SAT求解算法包括完备算法和不完备算法两大类
算法分类:

完备算法特点:

  1. 穷尽搜索空间
  2. 只要有足够的时间 一定能够给出答案适用于实际应用中的问题

**

不完备算法特点:

  • 大多采用局部搜索方法
  • 当问题可满足的时候,有可能给出答案,也有可能给不出答案
  • 当问题不可满足的时候,无法给出答案
  • 适用于随机产生的CNF公式 在处理可满足的大规模随 机生成问题时往往比完备算法快

完备算法——DPLL

  • 大部分的现有确定性求解器都是基于 DPLL 算法。
  • DPLL的基本思想是每次选中一个未被赋值的变量进行赋值,然后判断该赋值是否满足整个公式:
    满足:结束搜索;
    导致冲突:回溯;
    否则:对下一个变量进行赋值

在这里插入图片描述
DPLL 的核心思想就是依次对 CNF 实例的每个变量进行赋值,其搜索空间可以用一个二叉树来表示,树中的每个节点对应一个变量,取值只能为 0 或 1,左右子树分别表示变量取 0 或 1 的情况,从二叉树中根节点到叶子节点的一条路径就表示 CNF 实例中的一组变量赋值序列,DPLL 算法就是对这棵二叉树从根节点开始进行 DFS(深度优先搜索) 遍历所有的通路,以找到使问题可满足的解
不完备算法——SLS

大多数不完备算法是基于 SLS的,其搜索过程为:给定一 个命题公式,首先随机地生成一个真值赋值 ,如果该赋值使得公式可满足,则搜索结束 ;否则选择其中一个变量翻转其真值,该过程一直重复 ,直到找到使得公式满足的真值赋值或迭代次数达到预定上限 (公式的可满足性不能确定 )。尽管 SLS 求解器会因附加不同的启发式而使复杂性提高,但整体来说, SLS求解器都是基于局部搜索非常简单的规则。

SMT求解器

  • SMT的全称是Satisfiability Modulo Theories ,可被翻译为“可满足性模理论”
    “多理论下的可满足性问题”或者“特定(背景)理论下的可满足性问题”
  • SMT问题是判定SMT公式是否可满足的问题。SMT公式是结合了背景理论的一阶逻辑公式,这些理论包括一些数学理论和计算机领域内用到的数据结构理论等。
  • 示例
    在这里插入图片描述
    在这里插入图片描述
  • 算法
    积极算法:积极算法是早期的SMT求解器采用的算法,它是将SMT公式转换成一个CNF型的命题公式,然后用SAT求解器求解。
    惰性算法:它目前采用的主流方法,也是被研究得最多的算法。这种算法是先不考虑理论,将一个SMT公式看作SAT公式求解,然后再用理论求解器判定SAT公式的解所表示的理论公式是否一致。目前多数大型的SMT求解器采用了惰性算法。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、模型检测工具

SMV 用以检测一个有限状态系统是否满足CTL公式,建模方式是以模块为单位,模块描述的基本要素是非确定性选择、状态转换、并行赋值语句。检测的基本方法是以二叉图表示状态转换关系,以计算不动点的方法检测状态的可达性和其所满足的性质
***SPIN***用以检测一个有限状态系统是否满足PLIL公式及其他一些性质。它的建模方式是以进程为单位,进程描述的基本要素包括赋值语句,条件语句,通讯语句,非确定性选择和循环语句。模型检测的基本方法是以自动机表示各进程和PLTL公式,以计算这些自动机的组合可接受的语言是否为空的方法检测进程模型是否满足给定的性质

SPIN

功能:SPIN适用的领域是检测一个有限状态系统是否满足LTL公式(线性时序逻 辑)表示的性质,如可达性和死锁等。
建模:首先定义进程模板,每个进程模板作为一类进程的行为规范,而实际系统可以看成一个或若干个进程模板实例的异步组合。进程描述的基本要素包括赋值语句,条件语句,通讯语句,非确定语句和循环语句。

在这里插入图片描述
SPIN首先从描述系统模型规格开始,经分析没有语法错误后,对系统的交互进行模拟,直到确认系统设计拥有预期的行为。然后,SPIN将产生一个用C语言描述的验证程序,经检验机编译后执行,执行中如果发现了违背正确性说明的任何反例,则返回到交互模拟执行状态再继续仔细诊断,确定产生反例的原因
(On-the-fly技术On-the-fly模型检测技术有时也称为局部模型检测。它的基本原理是根据验证性质的需要展开系统路径所包含的状态,以避免预先生成系统中所包含的所有的状态。这种方法的一个显而易见的优点是一旦验证算法找到一个反例,算法即可终止,而不必生成剩余的状态空间。)
特点:

  • SPIN对用Promela语言描述的网络协议设计规范(Specification)的逻辑一致性进行检验,并报告系统中出现的死锁、无效的循环、未定义的接收和标记不完全等情况

  • SPIN无需构建一个全局的状态图或者Kripke结构,而可以按需生成系统自动机的部分状态进行检验(on-the-fly技术)

  • 可以将SPIN作为一个完整的LTL (Linear Temporal Logic)模型检验系统来使用

  • 对于给定的一个使用PROLEMA描述的协议系统,SPIN可以对其执行任意的模拟,也可以生成一个C代码程序,然后对该系统的正确性进行有效的检验

  • 适于不同规模的系统的验证。对于中小规模的系统,采用穷举状态空间分析,而对于大规模的系统,则采用BitState Hashing方法来有选择地搜索部分状态空间

CBMC

当系统具有无穷多个状态转移或状态转移数目非常大时,计算并访问所有状态几乎是不可能的。有界模型检查(bounded model checking)通过有限次展开转移来解决这个问题,转移展开次数称为界。当展开界足够大且趋于无穷时,系统的有界模型等于无界模型。
通过程序的静态单赋值形式(SSA),CBMC巧妙地用布 尔公式编码程序的(有限的)所有可能运行迹。由于无法静态 确定程序中循环的执行次数,CBMC将循环进行有限次展开, 展开次数可以设定为0或1,也可由用户给定。
大致过程:通过程序预处理和变量改名得到一个完全由赋值和条件语句组成的程序,将每个赋值语句变换成位向量等式C,检查性质得到位向量等式P,如CP(C析取非p)的布尔公式转换为CNF,输入到一个SAT solver,公式 CP是可满足的,当且仅当存在一个违反给定性质P的运行迹,该运行迹就是一个反例。
具体过程:
1、CBMC 的第一步是输入程序,进行预处理和变量改名,然后生成 CFG
2、当我们获取程序的 cfg 图时,我们就可以获取每条路径对应的布尔公式
3、选择一条路径,获得逻辑公式,或者说是位向量C
4、用PCTL公式描述性质,获得位向量P
5、输入SAT求解器中,然后进行判定。

六、模型检测的应用

![电子线路设计验证的例子包括先进先出存储器的验证,验证的性质包括输入和输出的关系,浮点运算部件的验证,验证的性质包括计算过程所满足的不变式
复杂的协议的例子包括认证协议的验证,验证的性质包括对通话双方的确认,合同协议的验证,验证的性质包括公平和滥用的可能性。
软件验证的例子包括飞行系统软件的验证,验证的性质包括系统所处的状态和可执行动作之间的关系; 铁路信号系统软件的验证,验证的性质包括控制信号与控制装置状态的关系。

本文引用论文网站过多,未一一记录,侵删

  • 17
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值