[Soot-list] Can I ask for a code snippet of creating call graph for a library (no main class)?
Yi Lin
qinsoon at gmail.com
Fri Jun 29 01:26:11 EDT 2012
Hi,
I finally solved this. I will attach my code at the end (it may help
others perhaps, and any improvements are welcome).
But I now have another problem with Soot. Basically I need AST and call
graph for my work. I got call graph now, but how can I get AST from
soot? I see that Dava could decompile bytecode and construct AST. But I
assume soot should maintian ASTs when it do transformation. What is a
straightforward way to get AST in soot?
Thank you very much.
Regards,
Yi
-------------------
code for generating call graph for library (no main class):
build call graph:
// PackManager manages the packs containing the various phases and
their options
PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans",
new SceneTransformer() {
@Override
protected void internalTransform(String phaseName, Map options) {
CHATransformer.v().transform();
}
}));
Options.v().set_whole_program(true);
Options.v().set_process_dir(Arrays.asList(libDir)); //library dir
Options.v().set_soot_classpath("../rt.jar:"+libDir+":../jce.jar:.");
//library dir along with rt.jar/jce.jar from JRE/JDK
Scene.v().setEntryPoints(getAllMethods());
Scene.v().loadNecessaryClasses();
PackManager.v().getPack("wjtp").apply();
get all methods (as entrypoints):
public List<SootMethod> getAllMethods() {
ArrayList<SootMethod> entrypoints = new ArrayList<SootMethod>();
for (String klassName : allClasses) {
// klassName such as org.abc.MyClass
Scene.v().forceResolve(klassName, SootClass.SIGNATURES);
SootClass klass = Scene.v().getSootClass(klassName);
// adding all non-abstract method as entrypoint
for (SootMethod m : klass.getMethods()) {
if (!m.isAbstract()) {
entrypoints.add(m);
}
}
}
return entrypoints;
}
use call graph:
SootClass klass = Scene.v().getSootClass(someClassYouAreInterested);
SootMethod method = klass.getMethodByName(someMethodYouAreInterested);
CallGraph cg = Scene.v().getCallGraph();
Iterator<MethodOrMethodContext> sources = new
Sources(cg.edgesInto(focus));
while (sources.hasNext()) {
SootMethod src = (SootMethod)sources.next();
System.out.println(method + " is called by " + src);
}
On 26/06/12 14:17 , Z wrote:
> It might be more efficient that you learn them like -w, entrypoints
> etc... one by one. Most of them can be found in the survivor's guide.
>
> If you don't know whether to use such such options, try them!
>
> Cheers,
> Zell.
>
>> long list of questions, like whether to use whole program mode '-w',
>> what should be set as 'entrypoints', whether to use
>> CHATransformer.v().transform() or
>> PhaseOptions.v().setPhaseOption("cg.cha", "enabled:true") then
>> runPacks(), what is the timing to do that, etc. A code snippet would
>> answer all those annoying questions for me...
>>
>> Thank you very much.
>>
>> Regards,
>> Yi
>> _______________________________________________
>> Soot-list mailing list
>> Soot-list at sable.mcgill.ca
>> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
More information about the Soot-list
mailing list