模型检测model checking

一、基本概念

模型检测(model checking)是一种很重要的自动验证技术。它最早由Clarke和Emerson以及Quielle和Sifakis在1981年分别提出的,主要通过显式状态搜索或隐式不动点计算来验证有穷状态并发系统的模态/命题性质。由于模型检测可以自动执行,并能在系统不满足性质时提供反例路径,因此在工业界比演绎证明更受推崇。尽管限制在有穷系统上是一个缺点,但模型检查可以应用于许多非常重要的系统,如硬件控制器和通信协议都是有穷状态系统。很多情况下,可以把模型检测和各种抽象与归纳原则结合起来验证非有穷状态系统(如实时系统)。 

模型检测的基本思想是用状态迁移系统(S)表示系统的行为,用模态逻辑公式(F)描述系统的性质。这样“系统是否具有所期望的性质”就转化为数学问题“状态迁移系统S是否是公式F的一个模型?”,用公式表示为S╞F。对有穷状态系统,这个问题是可判定的,即可以用计算机程序在有限时间内自动确定。  

模型检测已被应用于计算机硬件、通信协议、控制系统、安全认证协议等方面的分析与验证中,取得了令人瞩目的成功,并从学术界辐射到了产业界。

模型检测应用过程中,需要考虑增加效率和减少内存空间需求,此外,需要研究减少模型本身或验证性质的复杂性,主要方法有不同类型的抽象、程序切片、模型分解、验证性质的分解等。

1)抽象的基本方法是抽掉系统中的细节、用尽可能少的状态来刻画系统的动作过程。
2)程序切片的基本十法界将程序中不影响所要验证的性质的语句去年以减少模型的复杂性。
2)模型分解的方法是将一个模型分解成若干部分,或者分别验证,或者提供一个较好的组合方法以降低验证的复杂性。同样,一个需要验证的性质也有可能分解成若干部分,然后分别验证。

二、模型检测的自动化工具

1)SMV-美国CMU大学开发,用于检测一个有限状态系统是否满足CTL(computing tree logic,计算树逻辑)公式,以模块为单位,模块可以同步或异步组合。基本方法是以二叉图表示状态转换关系,以计算不动点的方法检测状态的可达性及其所满足的性质。
2)SPIN-美国贝尔实验室开发,用于检测一个有限状态系统是否满足PLTL(Propositional Linear Temporal Logic,命题线性时序逻辑)公式及其他一些性质。
3)CWB及其不同版本-英国爱丁堡大学及美国北卡大学相继开发,用于检测系统间的等价关系、PRE-ORDER关系及系统是否满足mu演算公式,其建模语言是CCS语言或LOTOS(language of temporal ordering specification)语言,但其建模语言存在局限性且模型检测方法复杂,其应用性与上述两种工具差。

4)Murphi:http://verify.stanford.edu/dill/murphi.html。 

ACTL(action based temporal logical基于行为的时序逻辑

谓词逻辑—+模态算子:模态逻辑,模态逻辑有三种常用的:计算树逻辑、命题线性时序逻辑及mu演算,各自有其相应的模态算子,其中,mu演算主要缺点是不易读懂(最小、最大不动点的交错嵌套),但优势在于表示能力比较强,CTL和PLTL都可嵌入到它的真子集中,且相应的子集具有与CTL和PLTL相同的复杂度的模型检测算法。mu演算可作为模型检测的一般框架来研究。

 

模态算子比如:某个分枝、所有分枝、下一状态等。

三、延伸

模型检验的成功之处在于它用自动搜索代替手动证明来解决验证的问题。模型检验包括三部分:1。基于命题时态逻辑的规范语言,2。表示被验证系统的编码状态机的方法,3。验证算法,对状态空间的智能搜索以确定规范是真还是假。如果规范没有被实现,模型检验能够给出反例。这一条非常重要,因为它帮助我们debug。如图所示。


    状态爆炸是模型检验中的一个大问题,因为现在的复杂系统,其状态数都是天文数字。n个相互异步的进程,如果每个进程有m个状态,其状态数为m的n次方(m^n)。近年来,正是在这方面有许多突破。
    有序的二进制判决图(OBDD)提供了处理大系统进行符号模型检验的可能性。例如某些具有10^20状态的实例进行了符号模型检验。
    软件进程之间往往是异步的,状态数就会指数级增加。两个事件称为是独立的,如果不论它们按什么顺序执行,其结果是相同的整体状态。用偏序简化方法可以部分地解决异步进程的状态爆炸问题。
    近年来,布尔可满足性问题(SAT)的进展,对模型检验提出了有界模型检验(BMC)对硬件设计验证特别有效。其主要想法如下。假如要检验形如Fp的性质,BMC要确定是否存在一个长度为k的反例,即是否存在一条长度为k的通路,结束于一个循环,其每一个状态都有?p。这里所谓有界就是指这个k。有人对9510个锁存器和9499个输入的电路做了BMC。
    抽象映射是简化模型检验的另一种方法,如图4所示,把一堆状态简化为一个状态。原来系统称为具体系统,而简化了的系统称为抽象系统。抽象系统能够保持具体系统的许多性质,但也会丢失某些性质。已有许多结果揭示这一问题。

模型检测model checking_第1张图片

    状态爆炸的问题已经有了许多的研究,但是,并没有完全解决。这正是未来要解决的问题

 

四、小结

模型检验(model checking)自从1981年提出来以后,受到各种非议。至今28年过去了,才得到了学术界和工业界的广泛关注。这是很正常的。要求一个学术成果马上用于实际,很不现实。中国某些干部就这么急功近利。算法的设计验证包括三步:(1)需求规范;(2)建立可执行的系统模型;(3)开发可扩展的算法,一是去检验需求,二是当需求不能满足时进行诊断。
    需求规范可以用两种方式给定。一种是基于状态的需求,用转换系统指明系统的可观察行为;另一种是基于特性的需求,用说明性的方式。这些需求用一系列的时态逻辑公式表达。IEEE的PSL语言就用了这二者的组合。需求规范的无矛盾性和完全性仍然是一个问题。现在还缺乏某些外部需求的形式化,例如安全性(隐私),可重构性(不相互干扰的构造性),服务质量(抖动度)等。
    可执行的模型要求忠实性,即模型必须与被验证系统保持语义,而且必须是可检验的。这样,你验证的特性才能在实际系统中实现。为了避错和纠错,模型应该能从系统描述自动产生。对于硬件验证,此事从RTL描述出发,比较容易完成。而对于软件,可能只能在抽象级别上进行。扩展UML进行调度和资源管理无法提供严格的定时特性。而扩展硬件描述语言,像SystemC和TLM由于缺乏形式语义只能用于模拟。
    可扩展的验证方法对大系统不好做。一个解决办法是根据特定的语义范畴开发抽象技术,即在特定语义领域求解不动点方程。另一个解决办法是面对复杂性,用分而治之的途径。过去,特性被分成两部分:阶段-结论。现在,我们需要组合验证的理论,把验证组合起来,形成一个大的验证。

    计算机工程于其他自然科学一个巨大的不同就在于保证正确的验证的重要性。其他科学用建造理论来保证正确性和可预见性。我们需要建造复杂系统可靠模型的理论和方法。异构系统可能是同步的或异步的;不同的交互机制,如锁闭、监管、功能调用和消息传达;执行粒度不同,即硬件或软件。我们需要从基于自动机的组合中解放出来,考虑体系结构的组合,像协议、调度和总线。我们需要研究某些特定的特性类,例如无死锁、互操作。而不是去研究一般的安全特性。我们也需要研究特殊体系结构的验证技术。体系结构给定了部件间的交互机制。例如对环形或星形体系结构,对带抢先任务和固定优先级的实时系统,对时间触发的体系结构等。可以像测试定义可测试性一样,定义可验证性。

你可能感兴趣的:(模型检测model checking)