[Soot-list] CallGraph question
Jia Chen
jiaan27 at gmail.com
Fri Mar 25 19:12:10 EST 2005
Thanks a lot for the response. I updated my Soot release and got it
working now. However, there is still something strange happening.
When I have the code being analyzed as follows:
1. public void function5(int pram1, int pram2, String str) {
2. IfStatement ifStmt = new IfStatement();
3. int i = 0, j = 0;
4. String str2 = "testing";
5. str.charAt(0);
6. i = pram2;
7. function6(i, j);
8. int b = function8(j, i);
9. }
the output is:
CLINIT edge: $r2 = new com.jchen27.tempclass.IfStatement in
<com.jchen27.tempclass.Bar: void function5(int,int,java.lang.String)>
==> <java.lang.Object: void <clinit>()>
VIRTUAL edge: virtualinvoke r0.<com.jchen27.tempclass.Bar: int
function8(int,int)>(i2, i5) in <com.jchen27.tempclass.Bar: void
function5(int,int,java.lang.String)> ==> <com.jchen27.tempclass.Bar:
int function8(int,int)>
VIRTUAL edge: virtualinvoke r0.<com.jchen27.tempclass.Bar: void
function6(int,int)>(i5, i2) in <com.jchen27.tempclass.Bar: void
function5(int,int,java.lang.String)> ==> <com.jchen27.tempclass.Bar:
void function6(int,int)>
VIRTUAL edge: virtualinvoke r1.<java.lang.String: char charAt(int)>(0)
in <com.jchen27.tempclass.Bar: void
function5(int,int,java.lang.String)> ==> <java.lang.String: char
charAt(int)>
SPECIAL edge: specialinvoke $r2.<com.jchen27.tempclass.IfStatement:
void <init>()>() in <com.jchen27.tempclass.Bar: void
function5(int,int,java.lang.String)> ==>
<com.jchen27.tempclass.IfStatement: void <init>()>
however if I remove line 4, the VIRTUAL edge char charAt(int)
disappear, any idea?
Thx,
Jia
On Thu, 24 Mar 2005 19:51:32 -0500, Ondrej Lhotak
<olhotak at sable.mcgill.ca> wrote:
> I tried to run your code on the latest Soot release. I did not get the
> output that you did, but instead, I got an exception in the
> soot.toolkits.exceptions.ThrowableSet$Manager class. The reason for this
> exception is because basic classes necessary for the functioning of Soot
> (such as the various exceptions defined by the VM) were not loaded. They
> were not loaded because you are not extending Soot in the recommended
> way (by adding a subclass of BodyTransformer or SceneTransformer; see
> the Soot tutorials), but just calling into Soot directly. If you do want
> to call into Soot directly, you need to add the following two lines
> after the first line of code from your e-mail:
>
> soot.options.Options.v().set_whole_program(true);
> scene.loadBasicClasses();
>
> If I add those two lines, the output I get is:
>
> <verbose Spark output deleted>
> CLINIT edge: $r1 = new IfStatement in <Bar: void function5(int,int)> ==> <java.lang.Object: void <clinit>()>
> VIRTUAL edge: virtualinvoke r0.<Bar: int function8(int,int)>(i2, i5) in <Bar: void function5(int,int)> ==> <Bar: int function8(int,int)>
> VIRTUAL edge: virtualinvoke r0.<Bar: void function6(int,int)>(i5, i2) in <Bar: void function5(int,int)> ==> <Bar: void function6(int,int)>
> SPECIAL edge: specialinvoke $r1.<IfStatement: void <init>()>() in <Bar: void function5(int,int)> ==> <IfStatement: void <init>()>
> VIRTUAL edge: virtualinvoke r3.<java.lang.String: char charAt(int)>(0) in <Bar: void function5(int,int)> ==> <java.lang.String: char charAt(int)>
>
> This is the correct output. Note that I had to add the functions necessary to
> get the code that you're analyzing to compile:
>
> public class Bar {
> public static final void main(String[] args) {
> new Bar().function5(1,2);
> }
> public int function8(int i, int j) {
> return 1;
> }
> public void function6(int i, int j) {
> }
> public void function5(int pram1, int pram2) {
> IfStatement ifStmt = new IfStatement();
> int i = 0, j = 0;
>
> String str = "testing";
> str.charAt(0);
> i = pram2;
> function6(i, j);
> int b = function8(j, i);
> }
> }
>
> Ondrej
>
> On Thu, Mar 24, 2005 at 07:04:04PM -0500, Jia Chen wrote:
> > Hi All,
> >
> > I am working on a project that requires finding out all the methods
> > that are invoked as a result of one method being invoked. So I found a
> > piece of cod that builds a CallGraph from a method. However, when I
> > iterated through all out-going edges from the method, all I could see
> > were SPECIAL, STATIC, and FINALIZE edges. Can anyone tell me how I can
> > get the other edges also? Follows is the code I am using.
> >
> > Thanks in advance.
> > Jia
> >
> > // ---- Code using Soot ----------------------------------------------
> > Scene scene = Scene.v();
> > SootClass sootClass = scene.loadClassAndSupport(className);
> >
> > Scene.v().setEntryPoints(sootClass.getMethods());
> > Map sparkOptions = new HashMap();
> > sparkOptions.put("enabled", "true");
> > sparkOptions.put("on-fly-cg", "true");
> > sparkOptions.put("set-impl", "hybrid");
> > sparkOptions.put("propagator", "worklist");
> > sparkOptions.put("verbose", "true");
> > SparkTransformer.v().transform("cg", sparkOptions);
> >
> > SootMethod sMethod = sootClass.getMethod(methodName);
> > CallGraph callGraph = scene.getCallGraph();
> > Iterator iter = callGraph.edgesOutOf((MethodOrMethodContext)sMethod);
> >
> > while (iter.hasNext()) {
> > System.out.println(iter.next());
> > }
> > // ---- End of Code using Soot ----------------------------------------
> >
> > // ---- Function being analyzed --------------------------
> > public void function5(int pram1, int pram2) {
> > IfStatement ifStmt = new IfStatement();
> > int i = 0, j = 0;
> >
> > String str = "testing";
> > str.charAt(0);
> > i = pram2;
> > function6(i, j);
> > b = function8(j, i);
> > }
> > // ---- End of function being analyzed --------------------
> >
> > // ---- Output ----------------------------------------------
> > SPECIAL edge: specialinvoke $r2.<tempclass.IfStatement: void
> > <init>()>() in <.tempclass.IfStatement: void function5(int,int)> ==>
> > <tempclass.IfStatement: void <init>()>
> > // ---- End of Output ----------------------------------------
> > _______________________________________________
> > Soot-list mailing list
> > Soot-list at sable.mcgill.ca
> > http://www.sable.mcgill.ca/mailman/listinfo/soot-list
> >
>
More information about the Soot-list
mailing list