[Soot-list] [Beginnger] A few questions about cfg and Soot
Eric Bodden
eric.bodden at mail.mcgill.ca
Wed Jul 8 10:57:45 EDT 2009
> i'm quite new to Soot. For bytecode analysis i used ASM but it is more a
> manipulation than analyzing framework.
> I read the survival guide and a few papers. But i can't figure out how
> to construct an inter-procedural control flow graph and traverse through
> it.
>
> Here is a simple example
>
> class Adder{
>
> public static void main(...){
>
> Calc calc = new Calc();
> int a = 10;
> int b = 5;
> calc.printadd(a,b);
>
> }
>
> }
>
> class Calc{
>
> private int add(int a, int b){
> return a+b;
> }
>
> public void printadd(int a, int b){
> int res = add(a,b);
> System.out.println("res: " + res);
> }
>
> }
>
> I want to know, if there is a call for the add(int,int) method which i
> can reach from the main method?
> Is there a way to construct an inter-procedural cfg, so that i can go
> from main to every node i can reach?
Hi Olaf.
Soot does not really support inter-procedural control-flow graphs (in
the sense that those graphs would tell you the order in which method
calls may appear), but I think what you are actually looking for is
just a call graph (which tells you which methods may call which other
methods, irrespective of the order of these calls). This can be
achieved very easily:
1.) Enable whole-program mode using the -w flag.
2.) Optionally: use phase options to tell Soot what kind of call graph
you like:
http://www.sable.mcgill.ca/soot/tutorial/phase/phase.html#SECTION00040000000000000000
3.) Add a SceneTransformer to the wjtp pack. Within the
SceneTransformer's transform method you can easily access the call
graph using Scene.v().getCallGraph().
> In this example a and b are constants, is it possible if i know, there
> is a call for add, to calculated the arguments? (maybe a kind of
> inter-procedural "constant" propagation + folding)
Yes, you would need inter-procedural constant folding for this. Soot
does not have this built-in, I believe, but you could certainly write
such a constant folder yourself once you have the call graph.
> The general question is: can i reach a method A form entry E -> if there
> is a call, which arguments are used? (constant values or every int < 10
> is possible ?)
Constants will appear as Value instances of type IntConstant in
Jimple. Hence, they should be easy to detect. It may help to look at
Soot's intra-procedural constant folder before you get started.
> Can i define my own entry method? The programs i want to analyze don't
> have a main method (kind of services).
Yes, that can be done using the EntryPoints class, but that would
probably require that you call the call-graph construction manually
instead of having the framework do it. I would recommend to instead
write a "dummy" main class that calls your actual entry point and then
feed this class to Soot using the -main-class argument.
Eric
--
Eric Bodden
Sable Research Group, McGill University
Montréal, Québec, Canada
More information about the Soot-list
mailing list