使用Soot分析Java程序

问题描述

我正在尝试使用Soot对名为Example.java的java文件执行数据流分析。

这是我的Example.java文件,我的目标是知道将调用哪个saySomething方法animal.saySomething()。这是我正在使用的Example.java的代码

package a1;

public class Example {
    static Animal neverCalled() {
        return new Fish();
    }
    static Animal selectAnimal() {
        return new Cat();
    }
    public static void main(String[] args) {
        Animal animal = selectAnimal();
        animal.saySomething();
    }
}
abstract class Animal {
    public abstract void saySomething();
}
class Cat extends Animal {
    public void saySomething() {
        System.out.println("purr");
    }
}
class Dog extends Animal {
    public void saySomething() {
        System.out.println("woof");
    }
}
class Fish extends Animal {
    public void saySomething() {
        System.out.println("...");
    }
}
class Car {  // not an Animal
    public void saySomething() {
        System.out.println("honk!");
    }
}

这是我用来使用Soot分析Example.java代码,此代码位于文件TestSootCallGraph.java中,其代码如下:

   package a1;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;

import soot.*;
import soot.jimple.Stmt;
import soot.jimple.spark.SparkTransformer;
import soot.jimple.toolkits.callgraph.CHATransformer;
import soot.jimple.toolkits.callgraph.CallGraph;
import soot.jimple.toolkits.callgraph.Targets;
import soot.options.Options;

public class TestSootCallGraph extends SceneTransformer {

    static LinkedList<String> excludeList;

    public static void main(String[] args)  {

        String mainclass = "Example";

//      //set classpath
        String javapath = System.getProperty("java.class.path");
        String jredir = System.getProperty("java.home")+"/lib/rt.jar";
        String path = javapath+File.pathSeparator+jredir;
        Scene.v().setSootClasspath(path);

            //add an intra-procedural analysis phase to Soot
        TestSootCallGraph analysis = new TestSootCallGraph();
        PackManager.v().getPack("wjtp").add(new Transform("wjtp.TestSootCallGraph",analysis));


        excludeJDKLibrary();

        //whole program analysis
        Options.v().set_whole_program(true);

            //load and set main class
        Options.v().set_app(true);
        SootClass appclass = Scene.v().loadClassAndSupport(mainclass);
        System.out.println(appclass);
        
        
        Scene.v().setMainClass(appclass);
        Scene.v().loadNecessaryClasses();


        //enable call graph
        //enableCHACallGraph();
        //enableSparkCallGraph();

            //start working
        PackManager.v().runPacks();
    }
    private static void excludeJDKLibrary()
    {
         //exclude jdk classes
        Options.v().set_exclude(excludeList());
          //this option must be disabled for a sound call graph
          Options.v().set_no_bodies_for_excluded(true);
          Options.v().set_allow_phantom_refs(true);
    }
    private static void enableSparkCallGraph() {

        //Enable Spark
          HashMap<String,String> opt = new HashMap<String,String>();
          //opt.put("propagator","worklist");
          //opt.put("simple-edges-bidirectional","false");
          opt.put("on-fly-cg","true");
          //opt.put("set-impl","double");
          //opt.put("double-set-old","hybrid");
          //opt.put("double-set-new","hybrid");
          //opt.put("pre_jimplify","true");
          SparkTransformer.v().transform("",opt);
          PhaSEOptions.v().setPhaSEOption("cg.spark","enabled:true");
    }

    private static void enableCHACallGraph() {
        CHATransformer.v().transform();
    }

    private static LinkedList<String> excludeList()
    {
        if(excludeList==null)
        {
            excludeList = new LinkedList<String> ();

            excludeList.add("java.");
            excludeList.add("javax.");
            excludeList.add("sun.");
            excludeList.add("sunw.");
            excludeList.add("com.sun.");
            excludeList.add("com.ibm.");
            excludeList.add("com.apple.");
            excludeList.add("apple.awt.");
        }
        return excludeList;
    }
    @Override
    protected void internalTransform(String phaseName,Map options) {

        int numOfEdges =0;

        CallGraph callGraph = Scene.v().getCallGraph();
        for(SootClass sc : Scene.v().getApplicationClasses()){
            for(SootMethod m : sc.getmethods()){

        Iterator<MethodorMethodContext> targets = new Targets(
                 callGraph.edgesOutOf(m));

                 while (targets.hasNext()) {

                     numOfEdges++;

                SootMethod tgt = (SootMethod) targets.next();
                 System.out.println(m + " may call " + tgt);
                 }
            }
        }

         System.err.println("Total Edges:" + numOfEdges);

    }
}

在执行旨在分析TestSootCallGraph.java的{​​{1}}时,我收到以下错误。我该如何解决

Example.java

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)