前言
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
.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
然后跑一波即可。