[Soot-list] Building a call graph for a class that has no main

John Dee jdsoot at hotmail.com
Tue Jul 26 09:32:44 EDT 2011


Thanks for the reply Eric,
I now have
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 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]);           Scene.v().forceResolve("testers.CallGraphs", SootClass.SIGNATURES);           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);           soot.Main.main(args);	}}
But I get a very strange exception:
Exception in thread "main" java.lang.RuntimeException: couldn't find class: javax.crypto.Cipher (is your soot-class-path set properly?) Try adding jce.jar to Soot's classpath, e.g.:java -cp sootclasses.jar soot.Main -cp .:/path/to/jdk/jre/lib/rt.jar:/path/to/jdk/jre/lib/jce.jar <other options>
Is there an easy fix for this? I'm using Eclipse 3.6.1 and the latest Soot jar file from here: http://vandyk.st.informatik.tu-darmstadt.de/abc/
Thanks again,JD
> From: bodden at st.informatik.tu-darmstadt.de
> Date: Tue, 26 Jul 2011 15:21:23 +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.
> 
> Your 1st variant will not work because you are setting the entry
> points too late. wjtp will run *after* cg, i.e. after the call graph
> was already constructed.
> 
> The 2nd variant fails because Soot has not yet loaded the class
> testers.CallGraphs at this point. Can you try inserting the following
> statement before you access the SootClass?
> 
> Scene.v().forceResolve("testers.CallGraph", SootClass.SIGNATURE);
> 
> Hope this helps,
> Eric
> 
> On 26 July 2011 14:11, John Dee <jdsoot at hotmail.com> wrote:
> > 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 piece
> > of 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
> >
> 
> 
> 
> -- 
> 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/5203616f/attachment-0001.html 


More information about the Soot-list mailing list