这周看了几篇关于模型检测的综述,大体分为三类:模型检测研究现状的综述、模型检测与软件测试相结合、UML模型检测方法。
一、模型检测研究综述
- 为什么出现了模型检测及模型检测面临的问题
(1)当前的软件系统功能验证主要采用的是软件测试方法,但软件测试的主要目的是通过给定系统不同的输入来验证系统是否会在当前给定的用例下出现错误,但由于测试用例的覆盖率难以达到百分之百,所以软件测试方法无法保证系统的正确性。
(2)模型检测解决了上述软件测试用例覆盖率不足导致无法验证系统正确性的问题,但同时在对大型复杂软件系统进行模型检测时,由于状态数量庞大导致计算机难以直接对其进行完全搜索,产生了空间爆炸问题 。为解决此问题,目前常用的方法是对系统的状态空间进行约简,例如抽象技术 [1] 、偏序规约技术[2] 和符号化模型检验技术[3] 等,或使用 on-the-fly [4]技术在动态生成系统有穷状态模型的同时进行性质验证,避免了传统方法需要预先构造出完整系统模型的问题。
[1]抽象技术:去掉与系统中属性无关的信息,保留重要信息,但不能消除信息导致系统状态发生改变。(类似数据预处理,减少冗余信息)
[2]偏序规约技术:通过发掘系统中并发执行的迁移的交换性,减少本质上相同的状态,从而仅生成足以检验性质的小部分状态空间。(我的理解是在系统在执行过程中有些状态会反复出现,所以对于重复出现的状态只生成一次来减少状态空间的大小)
[3]符号化模型检验技术:用布尔公式刻画状态集合和状态对集合,用OBDD(二叉判定图)来表示这些布尔公式,使用OBDD上的布尔操作来计算谓词转换子(其不动点刻画了CTL模态子),从而使模型检验在压缩了的符号化状态空间上来验证CTL性质。
[4]on-the-fly技术:把在生成状态节点的同时去检验当前状态是否满足待验证性质,不去预先生成整个状态节点,从而尽可能避免状态爆炸。(即在生成状态空间的) - 模型检测的基本概念
模型检测的基本思想是用状态迁移系统(S)表示并发系统的行为,用模态/时序公式(F)描述系统的性质,而模型检测问题简化为由系统是否具有期望的性质转为S是否是F的模型。
但对于有穷系统来说这样是可以判定的,模型检测的优点:1.自动的;2.一旦系统有不满足期望的性质时,可以举出反例,准确的指出错误的位置。 - 模型检测的过程
模型检测过程指用模型检测工具验证系统的整个过程,包括:
(1)选择恰当的形式化机制:逻辑、算法、数据结构;
(2) 对感兴趣的系统正确性属性建立形式化规约----要验证的性质(例如使用时序逻辑公式、ω-自动机等);
(3)用恰当的建模语言建立系统模型(例如 SML、Promela、C 语言等);
(4)抽象系统,去掉与属性无关的信息,保留重要信息;
(5)选择面向系统模型的模型检测工具,工具的输入为形式化的系统模型和性质,
(6)采用工具中集成的某种模型检测算法进行验证,最终给出检测结果。 - 模型检测当前可使用的工具
1)NuSMV-美国CMU大学开发,用于检测一个有限状态系统是否满足CTL(computing tree logic,计算树逻辑)公式,以模块为单位,模块可以同步或异步组合。基本方法是以二叉图表示状态转换关系,以计算不动点的方法检测状态的可达性及其所满足的性质。
2)SPIN-Spin 工具-是由美国学者霍尔茨曼研发出的另一种模型检测工具。并于 2001 年荣获了 ACM 软件系统奖 ,该工具可检测有限状态系统是否满足线性时序逻辑公式和其他性质。
3)UPPAAL 工具-是实时系统的模型检测工具。该工具以时间自动机作为系统的实现模型 ,并以 μ- 算子时间扩展作为解释说明语言 ,同时运用约束求解来解决系统无穷状态的空间难题 ,采用 on-the-fly 技术解决状态爆炸
问题。