SMV代表Symbolic Model Verifier,是我研究领域中用到的一个小工具。SMV所基于的原理简单说来是:先把实际中的系统建模为有限状态系统,系统所要满足的性质用CTL时态逻辑表示,然后把它们作为SMV的输入,自动执行模型检测算法,得出性质在系统上是否成立,若不成立就给出反例,说明为什么不成立。
SMV是Carnegie Mellon大学开发,能方便在http://www-2.cs.cmu.edu/~modelcheck/smv.html获得源码。
SMV源码主要包含16个h文件和c文件,再加上词法规则文件和语法规则文件,共18个源码文件,9154行代码。下面命令分别统计h、c文件代码行数和h、c文件个数:
$ find . -name "*\.[hc]" -print | xargs wc -l | tail –n1
$ find . -name "*\.[hc]" -print | wc –l
SMV设计了一种语言(称为SMV语言),以方便描述有限状态系统和CTL时态逻辑,处理这种语言的词法语法分析程序,借助经典的工具Yacc和Lax生成。SMV实现所要求的时态逻辑和符合模型检测知识,当分析到相关代码时详细介绍。
1.main函数总体框架
1)信号处理代码:
int i;
/* Catch all the signals we can catch, except for segfaults.
Core dumps are useful for debugging.
Also, stopping and resuming seems like a good idea. */
for(i = 0 ; i < 32 ; i++)
if((i != SIGSEGV) && (i != SIGCONT) && (i != SIGTSTP))
signal(i, signal_handler);
解析:
signal的声明十分复杂:void (*signal(int sig, void (*func)(int))) (int);
下图说明如何分析这样的声明(来自《c专家编程》中文版64页)