SMV 模型检测工具的使用

版权声明:本文为博主jmh原创文章,未经博主允许不得转载。 https://blog.csdn.net/jmh1996/article/details/85377367

前言

SMV是一个符号验证工具,是一个特别经典的形式化验证工具。本博文就关于如何安装smv做一些介绍。

SMV安装

linux 源码安装

wget http://www.cs.cmu.edu/~modelcheck/smv/smv.r2.5.4.tar.gz
tar -xvf smv.r.2.5.4.tar.gz
cd smv
make

如果报如下错误:
yacc找不到
则先安装flex和bison

sudo apt-get install flex bison

然后再make.
如果报

y.tab.c:520:7: error: conflicting types for ‘malloc’

window 安装

http://www.cs.cmu.edu/~modelcheck/smv/smv-nt2.5.zip
解压开来即可

使用样例

先编辑好有限状态机来,保存成 . s m v .smv 格式结尾的文件,然后使用svm.exe +文件名 既可。
样例:
examples/counter.smv

MODULE main
VAR
  bit0 : counter_cell(1);
  bit1 : counter_cell(bit0.carry_out);
  bit2 : counter_cell(bit1.carry_out);
SPEC
  AG AF bit2.carry_out

MODULE counter_cell(carry_in)
VAR
  value : boolean;
ASSIGN
  init(value) := 0;
  next(value) := value + carry_in mod 2;
DEFINE
  carry_out := value & carry_in;

这是一个3位的加法器。它的目标是为了检验看最高位是否会进位。main里面的SEPC 指定需要检验的安全属性。
运行结果:

-- specification AG AF bit2.carry_out is true

resources used:
processor time: 0.003 s,
BDD nodes allocated: 62
Bytes allocated: 1045232
BDD nodes representing transition relation: 14 + 1

使用方法

SMV的核心是在ASSIGN里面定义好有限状态机之间的状态转移,然后在SEPC里面使用CTL 计算树逻辑表示出所要检验的性质。如果状态机满足相应的性质,那么它就显示对应的sepecification为true,否则就给出一条路径证明这个sepecification是错误的。

说明文档

https://download.csdn.net/download/jmh1996/10886833

一个小trick

因为smv只输出不满足性质的路径,因此如果我们想找出满足原性质的路径,只需要写目标形式的非即可。
例如上面的例子:

  AG AF bit2.carry_out

表示所需检验的性质是对于所有的路径,这些路径都存在某个节点使用bit2.carry_out为1.
那么它的非就是 所有路径的bit2.carry_out全部为0.

  AG bit2.carry_out=0

然后跑一波即可。

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/85377367