以下algorithm是使用Computational Tree Logic(CTL)进行模型检查的草图:
据说:
CTL的模型检查问题是验证给定的过渡系统TS和CTL公式Φ是否TS | =Φ... CTL模型检查的基本过程相当简单:
- 递归地计算满足Φ的所有状态的集合Sat(Φ),并且
- 以下是TS | =Φ当且仅当我⊆星期六(Φ) 其中我是TS的初始状态集......
Sat(Φ)的递归计算基本上归结为CTL状态公式Φ的解析树的自下而上遍历。
所以你基本上(根据我的理解),你为系统提供一个CTL公式Φ,它是一个解析树,然后搜索状态,并通过CTL解析树,检查是否有任何状态满足Φ
问题是:
在Sat(Φ)方法中,大致发生了什么(符号的东西)。他们说下面的(2),其中S是状态,A是原子命题。想知道他们如何实际检查状态,假设程序实际上没有运行。这是(至少我认为)符号模型检查。想知道是否可以大致解释状态检查的工作原理。似乎某种input generation必须发生,但与此同时我想也许它不会发生。
我很难理解的原因是这个。假设其中一个断言用于函数addTricky(x, y)
,其实现如下:
function addTricky(x, y) {
if (y >= 1) return 3
return x + y
}
然后我会在某些逻辑中有一个布尔表达式,表示“在addTricky之前:z = 0之后z = addTricky(x,y):y> = 1 - > z = 3; y< 1; z = x + y“。
基本上试图解决模式的问题。如果Sat(Φ)基本上就是我在布尔表达式中所做的,我想知道它是否曾调用/调用函数addTricky
,或者它是否能以某种方式象征性地完成它。我不知道它是如何工作的,想知道符号执行如何工作的基础知识是否可以解释一下。对我来说,我一直在想象它正在进行某种单元测试,例如插入addTricky(1, 1)
,并检查所有可能性。也许那是“明确的国家探索”与象征性的探索,不确定。
非常感谢您的帮助!
(1)对于解析树的每个节点,即对于Φ的每个子公式Ψ,计算状态的集合Sat(Ψ),其中Ψ成立。
(2) Sat(a) = {s ∈ S | a ∈ L(s)}, for any a ∈ A
答案 0 :(得分:1)
我认为你的问题分为两部分:1)如何从软件功能转向过渡系统; 2)过渡系统如何用于检查满意度。
1)转换系统基本上是有限状态自动机的扩展。如果您有类似于您所描述的功能,则首先需要将其转换为过渡系统。例如,可以通过为代码的每个可执行行引入状态,以及遵循代码条件的那些状态之间的转换来完成此操作。在转换系统级别,您没有函数调用的概念,因此您需要在翻译期间处理此问题,例如,通过内部函数定义。此步骤与您验证转换系统的方式无关。你可以想象这会导致相当大的过渡系统。
还有其他不基于过渡系统的方法,它们模拟程序的执行并沿途收集符号约束。符号执行就是这样一个例子。
2)让我们说你内联你的addTricky函数并获得这些内容
L0: z=0
if (y>=1)
L1: z=3
else
L2: z=x+y
可能的TS是:
(L0: z=0) --[y >= 1]--> (L1: z=3)
|
[y<1]
\/
(L2: z=x+y)
你有3个可执行语句,这导致TS的符号状态(S)是:
L0: Z=0; X=?; Y=?
L1: Z=3; X=?; Y>=1
L2: Z=X+Y; X=?; Y<1
在哪里?意味着任何价值。这种方法的强大之处在于,您可以在单个符号状态中紧凑地表示X和Y的所有值。