象征性模型检查中符号状态探索的工作原理

时间:2018-05-30 02:55:44

标签: algorithm logic formal-verification model-checking

以下algorithm是使用Computational Tree Logic(CTL)进行模型检查的草图:

enter image description here

据说:

  

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

1 个答案:

答案 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的所有值。