[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