[Soot-list] Building a call graph for a class that has no main
John Dee
jdsoot at hotmail.com
Tue Jul 26 08:11:06 EDT 2011
Hi Eric,
still no luck.
I have the following code:
public class CallGraphExample{ public static void main(String[] args) { // create a list from args List<String> argsList = new ArrayList<String>(Arrays.asList(args)); // add on the following arguments argsList.addAll(Arrays.asList(new String[]{ "-w", "testers.CallGraphs" })); // 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(); SootClass a = Scene.v().getSootClass("testers.CallGraphs"); SootMethod m = a.getMethodByName("doStuff"); ArrayList<SootMethod> entryPoints = new ArrayList<SootMethod>(); entryPoints.add(m); Scene.v().setEntryPoints(entryPoints); SootMethod src = Scene.v().getMainClass().getMethodByName("doStuff"); CallGraph cg = Scene.v().getCallGraph(); Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src)); while (targets.hasNext()) { SootMethod tgt = (SootMethod)targets.next(); System.out.println(src + " may call " + tgt); } } })); args = argsList.toArray(new String[0]); soot.Main.main(args); }}
and I still get the same exception
"Exception in thread "main" java.lang.RuntimeException: There is no main class set!"
The application class is:
package testers;
public class CallGraphs{ public static void doStuff() { StringBuilder b = new StringBuilder("Blah"); b.append(" Blah"); new A().foo(); }}
class A{ public void foo() { bar(); } public void bar() { }}
If I try and set the entry points, just before the call 'soot.Main.main(args), using the following pieceof code:
SootClass a = Scene.v().getSootClass("testers.CallGraphs"); SootMethod m = a.getMethodByName("doStuff"); ArrayList<SootMethod> entryPoints = new ArrayList<SootMethod>(); entryPoints.add(m); Scene.v().setEntryPoints(entryPoints);
I get a runtime exception
Exception in thread "main" java.lang.RuntimeException: Aborting: can't find classfile testers.CallGraphs
Could you maybe try it out and see if you have the same issue?Thanks indeed for all your help,JD
> From: bodden at st.informatik.tu-darmstadt.de
> Date: Sun, 24 Jul 2011 15:16:58 +0200
> Subject: Re: [Soot-list] Building a call graph for a class that has no main
> To: jdsoot at hotmail.com
> CC: soot-list at sable.mcgill.ca
>
> Hi John.
>
> My apologies - apparently this is harder than it should be. I have
> made some changes to Soot, which should eliminate the problem. Please
> set your custom entry points using Scene.v().setEntryPoints(...). Make
> sure to provide an exhaustive list because this will cause Soot to
> ignore all default entry points.
>
> We are currently experiencing a problem with our build server but
> hopefully this will be fixed tomorrow and a new nightly build will
> appear here:
> http://vandyk.st.informatik.tu-darmstadt.de/abc/
>
> The version in SVN is fixed already.
>
> Eric
>
>
> On 23 July 2011 20:33, John Dee <jdsoot at hotmail.com> wrote:
> >
> > Hi,
> > I was just wondering if someone could give me some guidance on this? Perhaps
> > by a small worked example.
> > I'm still stuck and cannot set the entry point for a class that has no main
> > method.
> > Thanks & Regards
> > JD
> >
> > ________________________________
> > From: jdsoot at hotmail.com
> > To: bodden at st.informatik.tu-darmstadt.de; soot-list at sable.mcgill.ca
> > Date: Fri, 22 Jul 2011 17:05:00 +0100
> > Subject: Re: [Soot-list] Building a call graph for a class that has no main
> >
> > Hi Eric,
> > I have spent the past couple of hours looking over the information in the
> > archives and I can
> > find 2 possible solutions.
> > The first solution is stated here
> > - http://www.sable.mcgill.ca/pipermail/soot-list/2011-January/003434.html
> > Which says that before calling Soot's main method - you can call
> > Scene.v().setEntryPoints(new MyEntryPoints())
> > Now, I see an issue with this. To subclass 'EntryPoints', you must provide a
> > call to super with an
> > argument of type Singletons.Global. I'm not sure what that is or how to pass
> > it into the 'MyEntryPoints' constructor.
> > The second approach I found was here -
> > http://www.sable.mcgill.ca/pipermail/soot-list/2005-August/000326.html
> > This says to call 'EntryPoints.v().application' to get your application
> > entry points. You then alter this list and call
> > 'Scene.v().setEntryPoints(...)' with your altered list. I tried this and it
> > doesn't work either. I get an error stating:
> > Exception in thread "main" java.lang.RuntimeException: There is no main
> > class set!
> > I have no main method in my class and after trying several approaches, I
> > can't find a work around.
> > The code I have is:
> > public class CallGraphExample
> > {
> > public static void main(String[] args) {
> > // create a list from args
> > List<String> argsList = new ArrayList<String>(Arrays.asList(args));
> >
> > // add on the following arguments
> > argsList.addAll(Arrays.asList(new String[]{
> > "-w",
> > "testers.CallGraphs"
> > }));
> >
> > // 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();
> >
> > // return the soot class with the given name
> > SootClass a = Scene.v().getSootClass("testers.CallGraphs");
> >
> > List<SootMethod> entryMethods = new ArrayList<SootMethod>();
> > SootMethod method = a.getMethodByName("doStuff");
> > entryMethods.add(method);
> > entryMethods.addAll(EntryPoints.v().application());
> > Scene.v().setEntryPoints(entryMethods);
> > for (SootMethod sMethod : Scene.v().getEntryPoints()) {
> > if (sMethod.getName().equals("main")) {
> > Scene.v().getEntryPoints().remove(sMethod);
> > break;
> > }
> > }
> > SootMethod src = Scene.v().getMainClass().getMethodByName("doStuff");
> > CallGraph cg = Scene.v().getCallGraph();
> > Iterator<MethodOrMethodContext> targets = new
> > Targets(cg.edgesOutOf(src));
> > while (targets.hasNext()) {
> > SootMethod tgt = (SootMethod)targets.next();
> > System.out.println(src + " may call " + tgt);
> > }
> > }
> > }));
> > args = argsList.toArray(new String[0]);
> > soot.Main.main(args); // **** EXCEPTION THROWN HERE
> > }
> > }
> > My test class looks like:
> > package testers;
> > public class CallGraphs
> > {
> > public static void doStuff() {
> > StringBuilder b = new StringBuilder("Blah");
> > b.append(" Blah");
> > new A().foo();
> > }
> > }
> > class A
> > {
> > public void foo() {
> > bar();
> > }
> > public void bar() {
> > }
> > }
> > I have also tried updating the EntryPoints list before the call
> > to soot.Main.main(args) and this doesn't work either.
> > When I do this, I get an error stating -
> > Exception in thread "main" java.lang.RuntimeException: Aborting: can't find
> > classfile testers.CallGraphs at soot.Scene.getSootClass(Scene.java:484) at
> > dk.brics.soot.callgraphs.CallGraphExample.main(CallGraphExample.java:56)
> > I'm using Eclipse 3.6 with the latest version of Soot. I'm really stuck and
> > don't know what else to try. if anyone could
> > help me out I would really appreciate it. As I mentioned, I have examined
> > the archives but can't find a definitive answer.
> > Thanks & regards
> > JD
> >> From: bodden at st.informatik.tu-darmstadt.de
> >> Date: Fri, 22 Jul 2011 13:28:16 +0200
> >> Subject: Re: [Soot-list] Building a call graph for a class that has no
> >> main
> >> To: jdsoot at hotmail.com
> >> CC: soot-list at sable.mcgill.ca
> >>
> >> Hi John.
> >>
> >> This has been answered many times on the list. Please search the
> >> archives for EntryPoints.
> >>
> >> Eric
> >>
> >> On 21 July 2011 23:03, John Dee <jdsoot at hotmail.com> wrote:
> >> > Hi there.
> >> > I refer to the example of building a class graph from the 'soot
> >> > survivors
> >> > guide':
> >> > public static void main(String[] args) {
> >> > List<String> argsList = new ArrayList<String>(Arrays.asList(args));
> >> > argsList.addAll(Arrays.asList(new String[]{
> >> > "-w",
> >> > "-main-class",
> >> > "testers.CallGraphs",//main-class
> >> > "testers.CallGraphs",//argument classes
> >> > "testers.A" //
> >> > }));
> >> > 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("testers.A");
> >> > SootMethod src =
> >> > Scene.v().getMainClass().getMethodByName("doStuff");
> >> > CallGraph cg = Scene.v().getCallGraph();
> >> > Iterator<MethodOrMethodContext> targets = new
> >> > Targets(cg.edgesOutOf(src));
> >> > while (targets.hasNext()) {
> >> > SootMethod tgt = (SootMethod)targets.next();
> >> > System.out.println(src + " may call " + tgt);
> >> > }
> >> > }
> >> > }));
> >> > args = argsList.toArray(new String[0]);
> >> > soot.Main.main(args);
> >> > }
> >> > The above example works fine, except that class 'CallGraphs' contains a
> >> > main
> >> > method. However, the class that I want to analyse does
> >> > not contain a main method. So, I'm wondering how I can set the method
> >> > entry
> >> > point?
> >> > Thanks & Regards,
> >> > JD
> >> >
> >> > _______________________________________________
> >> > Soot-list mailing list
> >> > Soot-list at sable.mcgill.ca
> >> > http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
> >> >
> >> >
> >>
> >>
> >>
> >> --
> >> Dr. Eric Bodden, http://bodden.de/
> >> Principal Investigator in Secure Services at CASED
> >> Coordinator of the CASED Advisory Board of Study Affairs
> >> PostDoc at Software Technology Group, Technische Universität Darmstadt
> >> Tel: +49 6151 16-5478 Fax: +49 6151 16-5410
> >> Mailing Address: S2|02 A209, Hochschulstraße 10, 64289 Darmstadt
> >
> > _______________________________________________ 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
> >
> >
>
>
>
> --
> Dr. Eric Bodden, http://bodden.de/
> Principal Investigator in Secure Services at CASED
> Coordinator of the CASED Advisory Board of Study Affairs
> PostDoc at Software Technology Group, Technische Universität Darmstadt
> Tel: +49 6151 16-5478 Fax: +49 6151 16-5410
> Mailing Address: S2|02 A209, Hochschulstraße 10, 64289 Darmstadt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.cs.mcgill.ca/pipermail/soot-list/attachments/20110726/e799555d/attachment-0001.html
More information about the Soot-list
mailing list