[Soot-list] Soot exception during call graph build phase
Andrea Mattavelli
andrea.mattavelli at usi.ch
Wed Sep 26 08:48:33 EDT 2012
Hi Heejong,
as Eric pointed out the check is correct, since the method calls inside the call graph are always concrete.
You (as I did) are encountering problems since you are not using Soot in the correct way: you have to invoke soot.main.Main(…) and then get the result by means of a SceneTransformer.
Here it is a naive example that I used some time ago:
public static void main(String args[]){
soot.options.Options.v().set_soot_classpath(...);
soot.options.Options.v().set_whole_program(true);
soot.options.Options.v().allow_phantom_refs();
soot.options.Options.v().setPhaseOption("jb","use-original-names:true");
PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans", new SceneTransformer() {
@Override
protected void internalTransform(String arg0, Map arg1) {
…
}
}));
soot.Main.main(new String[]{
"-f", "none",
"-main-class", "com.google.javascript.jscomp.CommandLineRunner",
"-process-dir", ".../closure-compiler/build/classes"
});
soot.Scene.v().getCallGraph();
}
Hope this helps.
_________________________
Andrea Mattavelli
PhD Student
Faculty of Informatics
University of Lugano
via G. Buffi 13
CH-6900 Lugano - Switzerland
email: andrea.mattavelli at usi.ch<mailto:andrea.mattavelli at usi.ch>
phone: +41 58 666 4312
http://star.inf.usi.ch<http://star.inf.usi.ch/>
On 26-set-2012, at 10:31, Heejong Lee <heejong at gmail.com<mailto:heejong at gmail.com>> wrote:
Hi Eric and Andrea,
I've encountered the same problem as yours:
java.lang.RuntimeException: cannot set body for non-concrete method!
<com.yahoo.mobile.client.share.receiver.TimedSingleBroadcastReceiver:
void onReceiveBroadcast(android.content.Context,android.content.Intent)>
at soot.SootMethod.setActiveBody(SootMethod.java:338)
at soot.SootMethod.retrieveActiveBody(SootMethod.java:322)
at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processNewMethod(OnFlyCallGraphBuilder.java:531)
at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processReachables(OnFlyCallGraphBuilder.java:426)
at soot.jimple.toolkits.callgraph.CallGraphBuilder.build(CallGraphBuilder.java:84)
at soot.jimple.toolkits.callgraph.CHATransformer.internalTransform(CHATransformer.java:43)
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)
And I used following options (it's Scala code but readable
for Java programmers):
soot.G.reset()
soot.options.Options.v().set_allow_phantom_refs(true)
soot.options.Options.v().set_unfriendly_mode(true)
soot.options.Options.v().set_prepend_classpath(true)
soot.options.Options.v().set_output_format(10)
soot.options.Options.v().set_whole_program(true)
soot.options.Options.v().set_no_bodies_for_excluded(true)
classPath ++= List(jarFile, jars("android.jar"), jars("maps.jar"))
classPath.reduceLeftOption{_+":"+_}.foreach{
soot.options.Options.v().set_soot_classpath(_)
}
soot.options.Options.v().set_process_dir(List(jarFile))
Scene.v().loadNecessaryClasses()
soot.Main.v().run(emptyArray)
Sorry for asking again, but OnFlyCallGraphBuilder.processNewMethod
only checks for "m.isNative() || m.isPhantom()", not "m.isAbstract()".
Is it okay to do that? I found that the method(onReceiveBroadcast) which
throws an exception here is an abstract method.
Andrea, could you tell me how you solved your problem?
Thanks,
-- Heejong
On Wed, Jan 18, 2012 at 11:56 PM, Eric Bodden <eric.bodden at ec-spride.de<mailto:eric.bodden at ec-spride.de>> wrote:
Hi Andrea.
This may be a side-effect of the phantom-refs option, but I a not
sure. Instead of writing your own driver class and calling
CallGraphBuilder yourself, have you tried just calling
soot.Main.main(..) and accessing the call graph from within a
SceneTransformer? That should leave less room for error on your side.
Eric
On 18 January 2012 14:15, Andrea Mattavelli <andrea.mattavelli at usi.ch<mailto:andrea.mattavelli at usi.ch>> wrote:
Hi Eric,
thanks for your response, that's exactly what I think.
org.omegat.gui.editor.IEditor is an interface and Soot recognize <java.lang.String getCurrentFile()> as a non concrete method correctly.
I'm currently invoking Soot as follow (they are two pieces of non consecutive code):
Options.v().set_allow_phantom_refs(true);
Options.v().keep_line_number();
Options.v().set_whole_program(true);
Options.v().set_soot_classpath([…]);
[…]
ArrayList<SootMethod> applMethods = new ArrayList<SootMethod>();
Set<Entry<SootClass, ArrayList<SootMethod>>> entries = ClassRegistry.getInstance().getClasses().entrySet();
for (Entry<SootClass, ArrayList<SootMethod>> entry : entries) {
applMethods.addAll(entry.getValue());
}
Scene.v().setEntryPoints(applMethods);
Scene.v().loadNecessaryClasses();
// build call graph
CallGraphBuilder cgBuilder = new CallGraphBuilder();
cgBuilder.build();
CallGraph callGraph = Scene.v().getCallGraph();
What am I doing wrong?
Thank you very much for your help!
Andrea
On 18-gen-2012, at 13:00, Eric Bodden wrote:
Hi Andreas.
I checked the OnFlyCallGraphBuilder code and I found that into processReachables() and processNewMethod(SootMethod m) there are no checks to verify that the processed method is concrete.
Is it the code "buggy" or am I invoking the call graph builder in the wrong way?
I would be surprised if this code was buggy; we should have seen this
issue long before then. What's the status of
org.omegat.gui.editor.IEditor: java.lang.String getCurrentFile() ? Is
it an abstract or native method or is it just a regular one?
Also, how are you invoking the analysis?
Eric
--
Eric Bodden, Ph.D., http://bodden.de/
Head of Secure Software Engineering Group at EC SPRIDE
Principal Investigator in Secure Services at CASED
Tel: +49 6151 16-75422 Fax: +49 6151 16-72051
Room 3.2.14, Mornewegstr. 30, 64293 Darmstadt
_______________________________________________
Soot-list mailing list
Soot-list at sable.mcgill.ca<mailto:Soot-list at sable.mcgill.ca>
http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
--
Heejong Lee
Associate Research Engineer
Program Analysis Division
Fasoo.com<http://Fasoo.com>, Inc. (www.spa-arrow.com<http://www.spa-arrow.com>)
More information about the Soot-list
mailing list