符号执行和模型检查之间有什么区别(例如在模型转换中)?我不明白他们的区别。它们是一样的吗?!
答案 0 :(得分:3)
在模型检查中,您必须将系统编码为有限状态机,并将FSM提供给模型检查器以及规范。然后,模型检查器将确保规范始终保持在该系统中。
在符号执行中,您只提供程序,符号执行引擎将检查生成测试输入或检查断言的所有可行路径。
一个简单的例子:并发性。模型检查可以处理多线程系统,因为它在FSM中作为输入提供,但是,符号执行不能处理多个线程。
答案 1 :(得分:2)
模型检查: 一种正式验证程序是否满足规范的方法。规范通常以如下的时间逻辑公式给出:“如果输入是x输出必须是y - 保持程序的所有执行(全局)”(参见例如Edward A Lee)。
符号模型检查与显式状态检查: 程序可以是有限状态机(FSM)。这里显式状态检查就足够了。但幸运的是,模型检查器也存在于扩展的FSM,并发,概率,实时应用程序中。为了防止具有非常大(无限)状态的系统中的状态爆炸,使用符号模型检查。 在符号模型中,检查状态和输入等被视为符号和命题公式(或状态集,集合运算等)。要执行模型检查,需要进行可达性分析,为此,程序转换将以符号方式执行。这些检查器无法使用已检测的本机代码的正常执行。
符号执行: 在符号执行期间存在不同的编码方法。一些非常特定于模型检查,一些是模块化的并且在独立的符号执行框架中使用,因为它是由符号执行的发明者定义的。符号执行框架通常还使用符号模型检查的一些元素(探索,搜索)来用于测试等。
最后一些例子:
JPF,Java-Pathfinder:模型检查器,显式状态检查,输入:java字节代码
SPF,Symbolic Pathfinder:符号执行,JPF的扩展
JCBMC:有界模型检查器,JPF扩展,SPF
XRTs:探索和符号执行,输入:CIL字节代码
IntelliTest:参数化单元测试使用XRT
Spec Explorer:基于模型的测试使用XRT