记录下学习JavaPath Finder过程,差不多就是简单翻译下官方wiki把
jpf是执行字节码指令的。官方参考文档jpf-wiki
下图为JPF Top-level Design
虚拟机(VM)
状态生成器,通过执行字节码指令,生成状态描述,可用来检查状态是否被访问过,询问数据(线程状态、数据值等),存储状态,恢复状态。
VM主要参数为实现状态管理(匹配,存储、回溯)的类。多数执行机制委派给了SystemState,然后使用Scheduler
搜索策略
Search用来选择VM所需前行的下一个状态,或指导VM产生下一个状态(forward),或告诉VM回溯到先前的状态(backtrack).该类作为VM的一个驱动器使用。
Search通过评估性质对象,也能用来检查某种性质。
包结构
src
|__annotations
|__classes
|__examples
|__main
|__peers
|__tests
src/annotations 包含JPF annotations 的声明
src/classes 包含样板(库)类,以及通过MJI访问本地代码的类
src/main包含JPF核心实现代码
src/peers包含和src/classes中相符的同等类?
src/tests. 包含JPF的单元测试
需要关注的包为src/main
gov.nasa.jpf
这个包主要用于配置和实例化JPF对象,即Search和VM。初始化时,jpf.properties中包含的多数类都会被实例化。如:gov.nasa.jpf.search.DFSearch、gov.nasa.jpf.vm.SingleProcessVM、gov.nasa.jpf.jvm.JVMSystemClassLoaderInfo、gov.nasa.jpf.vm.DefaultBacktracker、gov.nasa.jpf.vm.OVHeap等
Config类 用于加载配置文件.properties和.jpf等,使用也包含多个创建对象的函数等。
gov.nasa.jpf.vm
这个包包含核心代码的主要部分,以及实现Java状态生成。主要的类为VM,该类将大部分工作分配给其下的类中,以实现JPF的主要功能,这些类主要分为三类:
- 类管理 - 由ClassInfo类封装,包含有关类的属性和方法的捕获由FieldInfo和MethodInfo封装。
- 对象模版 - JPF的所有对象数据都有Field类封装为存储为整型数组。Monitor实例补货对象的执行状态?Fields和Monitor实例一起组成对象,存储在ElementInfo中。heap包含ElementInfo对象的动态数组,其中数组索引用作对象引用值。
- 字节码执行 - 字节码指令的执行由SystemState和ThreadInfo类写作完成,其中一些工作也委派给了policy对象,以实现 partial order reduction。从VM对象调用SystemState.nextSuccessor(),然后到ThreadInfo.executeStep()(这两个方法封装了运行时POR),然后调用ThreadInfo.executeInstruction()来执行字节码。实际的执行然后由委派给了字节码具体指令实例gov.nasa.jpf.vm.bytecode。
gov.nasa.jpf.search
这个包主要包含Search类,即搜索策略的抽象层,主要的方法为Search.search(),由VM驱动(调用方法forward,backtrack和restore)。这个包也包含其他的搜索策略如DFSearch,gov.nasa.jpf.search.heuristic中有更多启发式搜索策略