定义:在早期阶段尽可能的确保设计的正确性。
缺陷:
- 当bug过多,系统设计简明耗时太长。
- 无法评估潜在的bug。
特点:尽可能详尽的探讨系统所有可能的行为。
定义:通过穷举(显示或隐式)给定系统的所有可达状态,并遍历它们的行为,验证该模型反应系统的期望行为属性。
优点:
- 全自动。无需监督,也无需专业的数理知识。
- 当设计不能满足所需属性,模型检测会产生一个反例,演示一个伪造属性的行为,为理解失败的原因以及修复问题提供了无价的线索。
意义:使形式验证领域发生彻底的变革,将其从一种纯学术学科转变为一种可行的实用技术,并可能·作为一种额外的有价值的附加设计验证方法整合到工业开发过程中(例如:内部模型检查器的开发以及在先进半导体和处理器制造商中的应用)。
20年后,模型检测已经成为一个成熟的学科。它从众多领域(软件工程、编程语言、抽象解释、SAT和SMT解决器、理论证明、自动化理论等等)学习扩充并对做出贡献。模型检测取得巨大成功,内容甚多,需要一个共同的基础来学习这一领域。
概念:一种检验有限状态并发系统的自动化技术。
优点:与传统方法(模拟、测试、演绎推理等)相比有大量优势 。
挑战:状态空间爆炸(state space exposion)—在能够交互的大量组件或能假定许多不同值的数据结构系统中发生。
实践:在复杂时序电路设计和通信协议等众多领域中得以成功运用。
从两个层面说明:
现实层面:随着物联网及许多技术的发展,软硬件系统应用广泛,系统出错的代价太大(例如由于软件故障,阿里安5号火箭发射失败),普通的规避错误的方法(直接关闭故障系统)并不可靠,因而对提高系统可靠性方法的需求很大。
未来层面:变革不断进行,物联网技术在未来将快速发展,对计算机设备的可靠性要求将越来越高。
本节主要内容:列举常用的形式化方法,并与模型检测作比较。
相同点:都需在实地部署系统前进行实验。
不同点:模拟在系统的抽象或模型上进行;测试在实际产品上进行。
用法:通常上是在系统的某些点注入信号,并在其他点观察产生的结果信号(例如在软件上提供特定输入,并观察输出结果)。
缺点:无法检验所有可能的交互和潜在的缺陷。
用法:通常使用公理和证明规则来证明系统的正确性。
发展历程:早期主要用于确保关键系统的正确性,且证明完全由手工构造;后期研究人员意识到可以开发软件工具来强制正确使用公理和证明规则,并且也能用于系统搜索,以提出从现阶段证明中取得进展的各种方法。
意义:在软件开发领域有着重大的影响(例如:演绎证明研究中的不变量概念)。
优点:可以用于无限状态系统的推理,这能在一定程度上实现自动化。
缺点:
(1)演绎验证是一个耗时的过程,只能由在逻辑推理方面受过教育并具有相当丰富经验的专家执行。所以演绎推理主要用于高度敏感的系统,例如安全协议。
(2)一些数学任务不能由一个算法来执行,可计算性理论表明程序的正确终止在一般情况下不能自动验证,这限制了可以自动验证的内容。因此,大多数证明系统不能完全自动化。
(3)虽然演绎验证可以在一定程度上实现自动化,但即使要验证的属性为真,也不能限制为找到证据所需的时间或内存。
概念:验证有限(使自动验证成为可能)状态并发系统的一种技术。
用法:该过程通常使用对系统状态空间的彻底搜索来确定某些规范是否正确。
优点:
(1)通过一些算法可以在中型机器上以合理的效率实现。
(2)模型检测适用于几类非常重要的系统(例如硬件控制器和通信协议)。
(3)非有限状态的系统可以使用模型检查结合各种抽象和归纳原则进行验证。
(4)在许多情况下,可以通过将无界数据结构限制为有限状态的特定实例来发现错误(例如可将程序的无界消息队列限制为小数量再进行调试)。
(5)无论何时可以应用,它都比演绎验证更可取。
规范中存在的问题:完整性。模型检测能为一个满足给定规范的设计模型提供检验方法,却无法确定所给定的规范能否覆盖系统应当满足的所有属性。
在这本书中,时态逻辑公式的意义将总是根据一个有标记的状态转换图来确定,这样的结构被称为克里普克(kripke)结构。
起源:最初由哲学家开发出来,为了观察时间在自然语言争论中的使用。
表达方式:大多数带有Gf操作符,表示如果f在未来为真,那么现在也为真。若表示时间e1和e2不会同时发生,那么书写为G(¬e1∨¬e2)。
使用:由于能在不显示引入时间的情况下描述事件发生的时间顺序,对特定并发系统的检测很有帮助。
分类标准:时间具有线性结构还是分支结构。
发展情况:
(1)Pnueli(普努利)是第一个使用时态逻辑进行并发推理的人。他的方法包括从一组描述程序中单个语句的行为的公理来证明所考虑的程序的属性。该方法由Bochmann、Malachi和Owicki推广到时序电路。由于证据是手工制作的,这种技术在实践中往往难以使用。
(2)早在1980年,Clarke和Emerson的时序逻辑模型检验算法介绍使得这种推理能够自动化。由于检验单个模型满足公式比证明公式对所有模型的有效性容易得多,因此可以非常有效地实现这一技术。由Clarke和Emerson为分支时间逻辑CTL开发的算法在所考虑的程序所确定的模型的大小和时间逻辑中其规格的长度上都是多项式的。他们还展示了在不改变算法复杂度的情况下如何处理公平性,这是一个重要的步骤因为许多并发程序的正确性取决于某种类型的公平假设(例如:在互斥算法中不存在饥饿可能取决于这样一个假设,即每个进程都会无限频繁地取得进展)。
(3)在同一时期,Quille和Sifakis给出了一个CTL子集的模型检测算法,但是他们没有分析它的复杂性。后来Clarke、Emerson和Sistla提出了一种改进的算法,该算法在公式的长度和状态转换图的大小的乘积上是线性的。该算法是在EMC模型检查器中实现的,该算法被广泛分布并用于检查多个网络协议和时序电路。早期的模型检查系统能够以每秒大约100状态的速度检查状态转换图中的10的4次方到10的5次方状态之间的典型公式。尽管有这些限制,模型检查系统被成功地用于在几个已发表的电路设计中发现以前未知的错误。
(4)Sistla和Clarke分析了各种时态逻辑的模型检验问题,特别是线性时序逻辑(LTL)的模型检验问题是PSPACE-完全的。Pnueli和Lichtenstein重新分析了检验线性时间公式的复杂性,并发现,虽然复杂度在公式的长度上是指数的,但它在全局状态图的大小上是线性的。基于这一观察,他们认为线性时间模型检查的高度复杂性对于短公式仍然是可以接受的。同年,Fujita实现了一个基于表格的LTL公式验证系统,并说明了它如何用于硬件验证。
(5)CTL* 是一个非常有表现力的逻辑,它将分支时间和线性时间运算符结合在一起。这个逻辑的模型检查问题在中首次被考虑,其中,它被证明是PSPACE-完全的,且与LTL的模型检查问题处于相同的一般复杂性类中。这一结果可以进一步验证CTL* 和LTL模型在状态图的大小和公式的大小上具有相同的算法复杂度(不超过常数因子)。因此,为了模型检查的目的,将自己限制在线性时态逻辑上没有实际的复杂性优势。
(6)其他一些研究人员已经提出了用于验证并发系统的替代技术,这些方法中有许多使用自动机作为规范和实现,检查实施情况,以查看其行为是否符合本规范的要求。由于同一类型的模型同时用于实现和规范,因此在一个级别上的实现也可以用作下一级精化的规范。Kurshan的工作中隐含了语言限制的使用,这最终导致了一个名为COSPAN的强大验证器的开发。Vardi和Wolper首次提出使用ω-自动机(无限词自动机)进行自动验证。他们展示了如何根据ω自动机之间的语言控制来制定线性时序逻辑模型检验问题。还考虑了自动机之间一致性的其他概念,包括观察等价和各种细化关系。
起源:1987年McMillan发现通过使用状态转换图的符号表示,可以验证大得多的系统。这种新的符号表示是基于布莱恩特的排序二进制决策图(OBDD)。
OBDD提供了布尔公式的规范形式,其通常比合取或析取范式更紧凑,并且已经开发出了用于操纵它们的非常有效的算法。这种符号表示由于捕捉了由电路和协议确定的状态空间中的一些规律性,因此可验证的状态数量级大大提升。
表达方式:通过将布尔值赋值给与电路或协议相关联的状态变量集来编码每个状态,转换关系可以用两组变量表示为布尔公式,一组用于编码旧状态,另一组用于编码新状态,该公式由二元决策图表示。由于谓词变换器(基于过渡关系)和固定点(表示并发系统的各种时间属性的状态集)都用OBDD表示。因此,可以避免显式构造并发系统的状态图。
工具:McMillan开发的模型检查系统SMV。
SMV基于用于描述分层有限状态并发系统的语言。语言中的程序可以通过在时间逻辑中表达的规范来注释。模型检查器从SMV语言的程序中提取表示为OBDD的转换系统,并使用基于OBDD的搜索算法来确定系统是否满足其规范。如果转换系统不满足某些规范,则验证程序将生成执行踪,以显示规范错误的原因。
强大性能表现:
Carnegie Mellon的研究人员用SMV语言构建了一个精确的协议模型,然后使用SMV表明所得到的过渡系统满足了缓存一致性的正式规范,并找到一些以前未被发现的错误和潜在的错误协议的设计。
应用:
1、Coudert,Berthet和Madre开发了一种算法,通过对产品自动机的状态空间进行广度优先搜索来显示两个确定性有限状态自动机之间的等价性。他们使用OBDD来表示算法中两个自动机的转换函数。Pixley也已经开发了类似的算法。此外,包括Bose和Fisher,Pixley和Coudert等人在内的几个小组已经尝试了使用OBDD的模型检查算法。
2、Bryant,Seger和Beatty开发了一种基于符号模拟的算法,用于限制线性时间逻辑中的模型检查。规范包括逻辑中表示的前置条件 - 后置条件对。前提条件用于限制电路的输入和初始状态,后置条件给出了用户希望检查的属性。
与用于指定程序和电路的大多数其他时间逻辑相比,该公式的语法受到高度限制。唯一允许的逻辑运算符是连接,唯一的时间运算符是下一次(X)。通过限制可以处理的公式类别,可以非常有效地检查某些属性。
背景:以往由于软件的结构往往不如硬件,且软件通常是异步的(进程相互独立,无全局同步时钟),模型检测在软件验证中使用较少。基于偏序约简的验证技术的提出使软件状态空间爆炸问题取得了很大的进展。这些技术利用并发执行事件的独立性。当按任意顺序执行时,两个事件是相互独立的,从而导致相同的全局状态。
使用:偏序约简技术使得减少必须考虑的交错序列数成为可能。因此,减少了模型检查所需的状态数。当规范不能区分仅根据并发执行事件的顺序不同的两个交错序列时,只分析其中一个就足够了。这些方法与程序执行的偏序模型有关,根据这个模型,并发执行的事件不会被排序。每个部分有序的执行可以对应于多个交错序列,如果不可能区分这些序列,则为每个事件的偏序选择一个交错序列就足够了。
补充:交错模型是并发软件的一个常见模型。在这个模型中,单个执行中的所有事件都以一个称为交错序列的线性顺序排列。并发执行的事件相对于彼此任意排列,并且大多数用于指定并发系统属性的逻辑都能区分两个独立事件以不同顺序执行的交错序列。因此,通常会考虑这些事件的所有可能交织,这可能导致非常大的状态空间。
发展:许多研究人员已经研究了通过仅选择可以交错独立执行的转换方式中的一个子集来减小状态空间的想法。
例如:Overman考虑了一种并发的受限模型,该模型不包括循环和非确定关系;
Katz和Ped的证明系统建议使用对应于相同偏序执行的交错序列之间的等价关系;
Valmari的固执集、Godefroid的持久集、Peled的样本集也采用偏序约简思想;
虽然符号表示和部分顺序减少大大增加了可以验证的系统的大小,但是许多现实系统仍然太大而无法处理。因此,重要的是找到可以与符号方法结合使用的技术,以扩展可以验证的系统的大小。四种这样的技术是组合推理,抽象,对称和归纳。
组合推理:
方法基础:利用复杂电路和协议的模块化结构。
使用:许多有限状态系统由并行运行的多个进程组成,这类系统的规范通常可以分解为描述系统小部分行为的属性,组合推理只使用其描述的系统部分来检查每个本地属性。
引申:当系统各组件之间相互依赖时,采用假设保证推理(在验证一个组件的属性时,须加上对其他组件的行为进行假设这一前提,若其他组件正确,假设取消)。
抽象:
方法基础:基于包含数据元素的系统的规范通常涉及系统中的数据值之间的相当简单的关系。
使用:通过将映射扩展到状态和转换,可生成抽象系统。由于抽象系统通常比实际系统小得多,属性的验证也相对比较简单。
对称:
方法基础:具有对称性的系统意味着存在保留状态转移图的非平凡置换组,这样的组可用于定义系统状态空间的等价关系,并减少状态空间。
使用:有限状态并发系统通常包括复制组件,由此可得系统的简化模型,简化模型可用于简化由时间逻辑公式表示的原始模型的属性的验证。
归纳:
方法基础:对整个有限族系统的自动推理。
使用:检查给定家族中的每个系统是否满足某种时间逻辑性质时,使用归纳论证来验证不变量(表示族中任意成员的行为的不变过程)是否是适当的代表,使用此不变量,我们可以立即检查族中所有成员的此类属性。