在研究JPF时,发现存在两个版本的JPF,一个是在sourceforge上代码库,自2006后不再更新,但用svn签出;一个是NASA软件工程实验室自建的Mercurial版本库服务器上代码库,现在依然在开发更新,并且提供的完整的在线WIkI文档。我们使用的是NASA的.
官网
在Eclipse的菜单中
http://babelfish.arc.nasa.gov/trac/jpf/raw-attachment/wiki/install/eclipse-plugin/update/
然后一路next……..
JPF site cofiguration
#以下是路径,按照你自己的放置jpf-core的路径设置
jpf-core=E:\JPF\jpf-core
extensions=${jpf-core}
菜单按如下路径一直点
菜单按如下路径一路点下去
<project name="jpf-core" default="build" basedir=".">
<property file="local.properties"/>
<property environment="env"/>
<property name="debug" value="on"/>
<property name="deprecation" value="on"/>
<uptodate property="build_uptodate" targetfile="build/main/gov/nasa/jpf/build.properties" srcfile="build.properties"/>
<path id="lib.path">
<pathelement location="build/main"/>
<pathelement location="build/peers"/>
<pathelement location="build/annotations"/>
<fileset dir=".">
<include name="lib/*.jar"/>
fileset>
path>
<target name="-init">
<tstamp/>
<mkdir dir="build"/>
<available property="have_javac" classname="com.sun.tools.javac.Main"/>
<fail unless="have_javac">no javac was found __or__ check http://babelfish.arc.nasa.gov/trac/jpf/wiki/install/build for possible solutionsfail>
<available file="src/main" type="dir" property="have_main"/>
<available file="src/annotations" type="dir" property="have_annotations"/>
<available file="src/peers" type="dir" property="have_peers"/>
<available file="src/classes" type="dir" property="have_classes"/>
<available file="src/tests" type="dir" property="have_tests"/>
<available file="src/examples" type="dir" property="have_examples"/>
<available file=".hg" type="dir" property="have_hg"/>
<fail unless="have_main">no src/mainfail>
<fail unless="have_annotations">no src/annotationsfail>
<fail unless="have_peers">no src/peersfail>
<fail unless="have_classes">no src/classesfail>
<fail unless="have_tests">no src/testsfail>
<fail unless="have_examples">no src/examplesfail>
<condition property="have_java8">
<equals arg1="${ant.java.version}" arg2="1.8"/>
condition>
target>
<target name="compile" depends="-init,-compile-annotations,-compile-main,-compile-peers,-compile-classes,-compile-tests,-compile-examples"
description="compile all JPF core sources" >
<copy file="build.properties" todir="build/main/gov/nasa/jpf" failonerror="false"/>
target>
<target name="-compile-annotations" if="have_annotations">
<mkdir dir="build/annotations"/>
<javac srcdir="src/annotations" destdir="build/annotations" includeantruntime="false"
debug="${debug}" deprecation="${deprecation}" classpath=""/>
target>
<target name="-compile-main" if="have_main">
<mkdir dir="build/main"/>
<javac srcdir="src/main" destdir="build/main" includeantruntime="false"
debug="${debug}" deprecation="${deprecation}" classpathref="lib.path">
javac>
target>
<target name="-compile-peers" if="have_peers" depends="-compile-main" >
<mkdir dir="build/peers"/>
<javac srcdir="src/peers" destdir="build/peers" includeantruntime="false"
debug="${debug}" deprecation="${deprecation}" classpathref="lib.path">
<compilerarg value="-XDenableSunApiLintControl"/>
<compilerarg value="-Xlint:all,-sunapi,-serial"/>
javac>
target>
<target name="-compile-classes" if="have_classes" depends="-compile-annotations,-compile-main" >
<mkdir dir="build/classes"/>
<javac srcdir="src/classes" destdir="build/classes" includeantruntime="false"
debug="${debug}" deprecation="${deprecation}">
<compilerarg value="-XDenableSunApiLintControl"/>
<compilerarg value="-Xlint:all,-sunapi"/>
<classpath>
<path refid="lib.path"/>
<pathelement location="build/annotations"/>
classpath>
javac>
target>
<target name="-compile-tests" if="have_tests" depends="-compile-annotations,-compile-main,-compile-classes">
<mkdir dir="build/tests"/>
<javac sourcepath="" srcdir="src/tests" destdir="build/tests" includeantruntime="false"
debug="${debug}" deprecation="${deprecation}"
includes="*,gov/nasa/jpf/**,classloader_specific_tests/**">
<compilerarg value="-XDenableSunApiLintControl"/>
<compilerarg value="-Xlint:all,-sunapi,-serial,-rawtypes,-unchecked"/>
<include name="*gov/nasa/jpf/**"/>
<include name="classloader_specific_tests/**"/>
<include name="java8/**" if="have_java8"/>
<classpath>
<path refid="lib.path"/>
<pathelement location="build/annotations"/>
<pathelement location="build/classes"/>
classpath>
javac>
target>
<target name="-compile-examples" if="have_examples" depends="-compile-annotations,-compile-main">
<mkdir dir="build/examples" />
<javac srcdir="src/examples" destdir="build/examples" includeantruntime="false"
debug="${debug}" deprecation="${deprecation}"
classpathref="lib.path"/>
target>
<target name="-version" if="have_hg">
<exec executable="hg" outputproperty="version" searchpath="true" failonerror="false" failifexecutionfails="false">
<arg value="identify"/>
<arg value="-n"/>
exec>
<echo message="${version}${line.separator}" file=".version"/>
target>
<target name="build" depends="-cond-clean,compile,-version"
description="generate the core JPF jar files" >
<copy file=".version" todir="build/main/gov/nasa/jpf" failonerror="false"/>
<jar jarfile="build/jpf-classes.jar">
<fileset dir="build/classes"/>
<fileset dir="build/annotations"/>
<fileset dir="build/main">
<include name="gov/nasa/jpf/vm/Verify.class"/>
<include name="gov/nasa/jpf/JPFShell.class"/>
<include name="gov/nasa/jpf/util/TypeRef.class"/>
<include name="gov/nasa/jpf/util/test/TestJPF.class"/>
<include name="gov/nasa/jpf/util/test/TestMultiProcessJPF.class"/>
<include name="gov/nasa/jpf/util/test/TestJPFHelper.class"/>
fileset>
jar>
<jar jarfile="build/jpf.jar" index="true">
<fileset dir="build/main"/>
<fileset dir="build/peers"/>
<fileset dir="build/annotations"/>
<fileset dir="build/classes">
<include name="org/junit/*.class"/>
fileset>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Implementation-Vendor" value="NASA Ames Research Center"/>
<attribute name="Implementation-Title" value="Java Pathfinder core system"/>
<attribute name="Implementation-Version" value="${jpf.version}"/>
manifest>
jar>
<jar jarfile="build/jpf-annotations.jar">
<fileset dir="build/annotations"/>
jar>
<jar jarfile="build/classloader_specific_tests.jar">
<fileset dir="build/tests">
<include name="classloader_specific_tests/*.class"/>
fileset>
jar>
<jar jarfile="build/RunJPF.jar">
<fileset dir="build/main">
<include name="gov/nasa/jpf/tool/Run.class"/>
<include name="gov/nasa/jpf/tool/RunJPF.class"/>
<include name="gov/nasa/jpf/Config.class"/>
<include name="gov/nasa/jpf/ConfigChangeListener.class"/>
<include name="gov/nasa/jpf/Config$MissingRequiredKeyException.class"/>
<include name="gov/nasa/jpf/JPFClassLoader.class"/>
<include name="gov/nasa/jpf/JPFShell.class"/>
<include name="gov/nasa/jpf/JPFException.class"/>
<include name="gov/nasa/jpf/JPFConfigException.class"/>
<include name="gov/nasa/jpf/JPFTargetException.class"/>
<include name="gov/nasa/jpf/util/JPFSiteUtils.class"/>
<include name="gov/nasa/jpf/util/FileUtils.class"/>
<include name="gov/nasa/jpf/util/StringMatcher.class"/>
<include name="gov/nasa/jpf/util/Pair.class"/>
fileset>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Implementation-Vendor" value="NASA Ames Research Center"/>
<attribute name="Implementation-Title" value="Java Pathfinder core launch system"/>
<attribute name="Implementation-Version" value="${jpf.version}"/>
<attribute name="Main-Class" value="gov.nasa.jpf.tool.RunJPF"/>
manifest>
jar>
<jar jarfile="build/RunTest.jar">
<fileset dir="build/main">
<include name="gov/nasa/jpf/tool/Run.class"/>
<include name="gov/nasa/jpf/tool/RunTest.class"/>
<include name="gov/nasa/jpf/tool/RunTest$Failed.class"/>
<include name="gov/nasa/jpf/Config.class"/>
<include name="gov/nasa/jpf/ConfigChangeListener.class"/>
<include name="gov/nasa/jpf/Config$MissingRequiredKeyException.class"/>
<include name="gov/nasa/jpf/JPFClassLoader.class"/>
<include name="gov/nasa/jpf/JPFException.class"/>
<include name="gov/nasa/jpf/JPFConfigException.class"/>
<include name="gov/nasa/jpf/util/JPFSiteUtils.class"/>
<include name="gov/nasa/jpf/util/FileUtils.class"/>
<include name="gov/nasa/jpf/util/StringMatcher.class"/>
<include name="gov/nasa/jpf/util/DevNullPrintStream.class"/>
fileset>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Implementation-Vendor" value="NASA Ames Research Center"/>
<attribute name="Implementation-Title" value="Java Pathfinder test launch system"/>
<attribute name="Implementation-Version" value="${jpf.version}"/>
<attribute name="Main-Class" value="gov.nasa.jpf.tool.RunTest"/>
manifest>
jar>
target>
<target name="clean"
description="remove all build artifacts and temporary files">
<delete dir="build" failonerror="false"/>
<delete dir="tmp" failonerror="false"/>
<delete>
<fileset dir="." includes="**/*~" defaultexcludes="no" />
<fileset dir="." includes="**/*.bak" defaultexcludes="no" />
<fileset dir="." includes="**/error.xml" />
delete>
target>
<target name="-cond-clean" unless="build_uptodate"
description="remove all build artifacts and temporaries if build.properties has been changed">
<antcall target="clean"/>
target>
<target name="buildinfo" description="create buildinfo properties">
<exec executable="hg" outputproperty="uncommitted_changes" failifexecutionfails="true">
<arg value="status"/>
exec>
<condition property="have_uncommitted_changes">
<length string="${uncommitted_changes}" trim="true" when="greater" length="0"/>
condition>
<exec executable="hg" outputproperty="hg.tip.id" failifexecutionfails="false">
<arg value="tip"/>
<arg value="--template"/>
<arg value="{rev}:{node|short}\n"/>
exec>
<exec executable="hg" outputproperty="hg.author" failifexecutionfails="false">
<arg value="tip"/>
<arg value="--template"/>
<arg value="{author}\n"/>
exec>
<exec executable="hg" outputproperty="hg.tip.date" failifexecutionfails="false">
<arg value="tip"/>
<arg value="--template"/>
<arg value="{date|isodate}\n"/>
exec>
<exec executable="hg" outputproperty="hg.paths.default" failifexecutionfails="false">
<arg value="showconfig"/>
<arg value="paths.default"/>
exec>
<exec executable="hostname" failifexecutionfails="false" outputproperty="env.COMPUTERNAME"/>
<property name="hostname" value="${env.COMPUTERNAME}"/>
<delete file="build.properties" failonerror="false"/>
<propertyfile file="build.properties" comment="JPF core build info">
<entry key="revision" value="${hg.tip.id}"/>
<entry key="date.tip" value="${hg.tip.date}"/>
<entry key="author" value="${hg.author}"/>
<entry key="repository" value="file://${hostname}${basedir}"/>
<entry key="upstream" value="${hg.paths.default}"/>
<entry key="java.version" value="${java.version}"/>
<entry key="os.arch" value="${os.arch}"/>
<entry key="os.name" value="${os.name}"/>
<entry key="os.version" value="${os.version}"/>
<entry key="user.country" value="${user.country}"/>
propertyfile>
target>
<target name="dist" description="build binary distribution">
<delete file="build/${ant.project.name}*.zip"/>
<exec executable="hg" outputproperty="hg.tip.rev" failifexecutionfails="false">
<arg value="tip"/>
<arg value="--template"/>
<arg value="-r{rev}"/>
exec>
<zip destfile="build/${ant.project.name}${hg.tip.rev}.zip" update="false" excludes="*">
<zipfileset file="jpf.properties" prefix="${ant.project.name}"/>
<zipfileset file="build.properties" prefix="${ant.project.name}"/>
<zipfileset dir="lib" prefix="${ant.project.name}/lib"/>
<zipfileset dir="bin" prefix="${ant.project.name}/bin" filemode="754"/>
<zipfileset dir="build" includes="*.jar" prefix="${ant.project.name}/build"/>
zip>
target>
<target name="src-dist" description="build source distribution">
<delete file="build/${ant.project.name}*-src.zip"/>
<exec executable="hg" outputproperty="hg.tip.rev" failifexecutionfails="false">
<arg value="tip"/>
<arg value="--template"/>
<arg value="-r{rev}"/>
exec>
<zip destfile="build/${ant.project.name}${hg.tip.rev}-src.zip" update="false" excludes="*" whenempty="skip">
<zipfileset file="jpf.properties" prefix="${ant.project.name}"/>
<zipfileset file="build.properties" prefix="${ant.project.name}"/>
<zipfileset file="build.xml" prefix="${ant.project.name}"/>
<zipfileset file="LICENSE-2.0.txt" prefix="${ant.project.name}"/>
<zipfileset file="README" prefix="${ant.project.name}"/>
<zipfileset dir="src" prefix="${ant.project.name}/src"/>
<zipfileset dir="lib" prefix="${ant.project.name}/lib" erroronmissingdir="false"/>
<zipfileset dir="bin" prefix="${ant.project.name}/bin" filemode="754"/>
<zipfileset dir="tools" prefix="${ant.project.name}/tools" erroronmissingdir="false"/>
<zipfileset file=".project" prefix="${ant.project.name}"/>
<zipfileset file=".classpath" prefix="${ant.project.name}"/>
<zipfileset dir="eclipse" prefix="${ant.project.name}/eclipse"/>
<zipfileset dir="nbproject" prefix="${ant.project.name}/nbproject"/>
zip>
target>
<target name="test" depends="build"
description="run core regression tests" if="have_tests">
<property name="junit.home" value="${env.JUNIT_HOME}"/>
<condition property="junit.usefile">
<not>
<isset property="netbeans.home"/>
not>
condition>
<junit printsummary="on" showoutput="off"
haltonfailure="no" logfailedtests="true" failureproperty="test.failed"
dir="${basedir}" fork="yes" forkmode="perTest" maxmemory="1024m" outputtoformatters="true">
<formatter type="plain" usefile="${junit.usefile}"/>
<assertions>
<enable/>
assertions>
<classpath>
<path refid="lib.path"/>
<pathelement location="build/tests"/>
<pathelement location="build/classes"/>
<pathelement location="build/annotations"/>
<fileset dir="${junit.home}">
<include name="**/*.jar"/>
fileset>
classpath>
<batchtest todir="build/tests">
<fileset dir="build/tests">
<exclude name="**/JPF_*.class"/>
<include name="**/*Test.class"/>
<exclude name="**/SplitInputStreamTest.class"/>
fileset>
batchtest>
junit>
<fail if="test.failed" />
target>
project>
命令行查看
#执行环境
java -version
#编译环境
javac -version
如果版本不匹配,下载了新的JDK后修改JAVA_HOME环境变量即可
Buildfile: E:\JPF\jpf-core\build.xml
-cond-clean:
-init:
-compile-annotations:
-compile-main:
-compile-peers:
-compile-classes:
-compile-tests:
-compile-examples:
compile:
-version:
build:
[copy] Copying 1 file to E:\JPF\jpf-core\build\main\gov\nasa\jpf
[jar] Building jar: E:\JPF\jpf-core\build\jpf.jar
BUILD SUCCESSFUL
Total time: 1 second
首先一个普通的类
public class Racer implements Runnable {
int d = 42;
public void run () {
doSomething(1001);
d = 0; // (1)
}
public static void main (String[] args){
Racer racer = new Racer();
Thread t = new Thread(racer);
t.start();
doSomething(1000);
int c = 420 / racer.d; // (2)
System.out.println(c);
}
static void doSomething (int n) {
try { Thread.sleep(n); } catch
(InterruptedException ix) {}
}
}
然后
#执行的类
+target=Racer
#类文件的路径,不是源代码的路径
+classpath=E:\\code\\eclipse-items\\JPFTest\\bin
#符号执行的方法
+symbolic.method=Racer.main()
然后执行结果如下:
JavaPathfinder core system v8.0 (rev 29+) - (C) 2005-2014 United States Government. All rights reserved.
====================================================== system under test
Racer.main()
====================================================== search started: 16-5-14 下午1:12
10
10
10
====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.ArithmeticException: division by zero
at Racer.main(Racer.java:13)
====================================================== snapshot #1
thread java.lang.Thread:{id:0,name:main,status:RUNNING,priority:5,isDaemon:false,lockCount:0,suspendCount:0}
call stack:
at Racer.main(Racer.java:13)
====================================================== results
error #1: gov.nasa.jpf.vm.NoUncaughtExceptionsProperty "java.lang.ArithmeticException: division by zero a..."
====================================================== statistics
elapsed time: 00:00:00
states: new=11,visited=2,backtracked=6,end=3
search: maxDepth=7,constraints=0
choice generators: thread=10 (signal=0,lock=1,sharedRef=2,threadApi=3,reschedule=4), data=0
heap: new=378,released=47,maxLive=357,gcCycles=9
instructions: 3440
max memory: 123MB
loaded code: classes=66,methods=1502
====================================================== search finished: 16-5-14 下午1:12