[Soot-list] Can not get method of the soot class in cg pack

beswkwangbo beswkwangbo at 163.com
Sat Nov 29 03:08:59 EST 2014


Hi all,
    I am trying to draw a call graph with custom entry points. The code shows as bellow :
--------------------------------------------------------------------------------------------------------------
package cn.edu.pku.plde.callgraph;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import soot.MethodOrMethodContext;
import soot.PackManager;
import soot.Scene;
import soot.SceneTransformer;
import soot.SootClass;
import soot.SootMethod;
import soot.Transform;
import soot.jimple.toolkits.callgraph.CHATransformer;
import soot.jimple.toolkits.callgraph.CallGraph;
import soot.jimple.toolkits.callgraph.Targets;

public class CallGraphBuilder {
   
    public static CallGraph cg = null;
   
    public static void getCallGraph(final String appDir, final String clsName, final String mtdName){
       
        final List<String> argsList = new ArrayList<String>();
           argsList.addAll(Arrays.asList(new String[] { "-w", "-process-dir", appDir, //"-p", "cg", "all-reachable:true",
                    "-pp", "-allow-phantom-refs", "-output-format", "none"}));
       
           PackManager.v().getPack("cg").add(new Transform("cg.myTrans", new SceneTransformer() {

                @Override
                protected void internalTransform(String phaseName, Map options) {
                   
                    SootClass a = Scene.v().getSootClass(clsName);
//                    SootClass a = Scene.v().forceResolve(clsName, SootClass.SIGNATURES);
                    List<SootMethod> entryMethods = new ArrayList<SootMethod>();
                    System.out.println(a.getMethods().toString());
                    SootMethod method = a.getMethodByName(mtdName);
                    entryMethods.add(method);
                    Scene.v().setEntryPoints(entryMethods);
                }
            }));
       
           PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans", new SceneTransformer() {

                @Override
                protected void internalTransform(String phaseName, Map options) {
                   
                       CHATransformer.v().transform();
                       SootClass a = Scene.v().getSootClass(clsName);
                       SootMethod method = a.getMethodByName(mtdName);
                       CallGraph cg = Scene.v().getCallGraph();

                       Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(method));
                       while (targets.hasNext()) {
                           SootMethod tgt = (SootMethod)targets.next();
                           System.out.println(method + " may call " + tgt);
                       }
                }
                  
               }
           ));
          
        String[] args = argsList.toArray(new String[0]);
        soot.Main.main(args);
    }
   
    public static void main(String[] args){
        CallGraphBuilder.getCallGraph("D:\\SootCallGraphTest\\bin", "testers.CallGraphs", "doStuff");
    }
}
------------------------------------------------------------------------------------------------------------------------------
The code in testers.CallGraphs is:
----------------------------------------------------------------------------------------------------------------------------
package testers;

public class CallGraphs {
//    public static void main(String[] args) {
//        CallGraphs cg = new CallGraphs();
//        cg.doStuff();
//    }
   
    public void doStuff() {//static
        A a = new A();
        Object o1 = (Object) a;
        o1.equals(a);
        f1();
        new A().foo();
    }
   
    public void f1(){
       
    }
}

class A {
    public static int key;
   
    @Override
    public boolean equals(Object a){
//        return this.equals(a);
        return false;
    }
   
    public void foo() {
        bar();
    }

    public void bar() {
    }
}
-------------------------------------------------------------------------------------------------------------------------
But, the output in console shows that soot did not parse method infomation for the class:

Soot started on Sat Nov 29 15:45:33 CST 2014
Warning: java.dyn.InvokeDynamic is a phantom class!
Warning: dk.brics.soot.callgraphs.CallGraphExample$1 is a phantom class!
Warning: dk.brics.soot.callgraphs.CallGraphExample$2 is a phantom class!
Warning: dk.brics.soot.callgraphs.CallGraphExample is a phantom class!
Warning: dk.brics.soot.callgraphs.Main is a phantom class!
Warning: testers.A is a phantom class!
Warning: testers.CallGraphs is a phantom class!
Warning: testers.Test is a phantom class!
[]
Exception in thread "main" java.lang.RuntimeException: couldn't find method doStuff(*) in testers.CallGraphs
    at soot.SootClass.getMethodByName(SootClass.java:494)
    at cn.edu.pku.plde.callgraph.CallGraphBuilder$1.internalTransform(CallGraphBuilder.java:39)
    at soot.SceneTransformer.transform(SceneTransformer.java:39)
    at soot.Transform.apply(Transform.java:89)
    at soot.RadioScenePack.internalApply(RadioScenePack.java:57)
    at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:49)
    at soot.Pack.apply(Pack.java:114)
    at soot.PackManager.runWholeProgramPacks(PackManager.java:417)
    at soot.PackManager.runPacks(PackManager.java:336)
    at soot.Main.run(Main.java:198)
    at soot.Main.main(Main.java:141)
    at cn.edu.pku.plde.callgraph.CallGraphBuilder.getCallGraph(CallGraphBuilder.java:66)
    at cn.edu.pku.plde.callgraph.CallGraphBuilder.main(CallGraphBuilder.java:70)



Would you please give me some advise ?
Thanks
Bo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20141129/76aadf49/attachment.html 


More information about the Soot-list mailing list