[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Constructing Call graphs without java.* classes



The -x option affects which classes are considered application classes
when Soot is run with the -app switch. However, for the purposes of call
graph construction, the complete call graph is always constructed. There
are no command-line options to exclude specific calls from the call
graph.

Probably the easiest way to achieve what you are trying to do is to
filter out the unwanted methods from the call graph when you are
printing it out. On each method, you can call getDeclaringClass() to get
its class, and decide based on the class whether to print the method or
not. You can do this by either parsing the package name yourself, or by
just calling isApplicationClass(). This will return true if the class
was mentioned on the command-line, or, when the -app switch is given, if
the class is not one of the library classes excluded by the -x switch.

Ondrej

On Sat, Feb 21, 2004 at 10:20:40AM -0800, Cleidson Ronald Botelho de Souza wrote:
> Hi all,
> 
> 	I am new to this list and to the Soot framework, so I apologize if I am 
> sending a too basic question to this list. First of all, let
> me tell you my interest: I am interested in using the Soot framework to 
> create call-graphs of Java programs. Soot, with this community and 
> continuos improvement seems very appropriate for me. Thanks for the 
> great work !
> 
> 	Anyway, I've already spent some time playing with Soot and with its 
> call-graph API. Indeed, a friend and I wrote the very simple code that 
> is attached. The code basically runs on a "HellowWorld.java" program and 
> creates a call-graph for it, which is later printed out.
> 
> 	However, I am facing a problem: the CallGraph is created but includes 
> Nodes that represent methods calls to classes in the following packages: 
> java.* and sun.*. And I am NOT interested in those. For the record, a 
> simple "HelloWorld.java" program is going to have about 6084 nodes, 
> while only 4 of them are relevant (i.e., from the HelloWorld program).
> 	
> 	I've tried several different set of parameters, including "-x java" as 
> explained in the manual, but nothing seems to work. According to the 
> manual, I should NOT need this, because those classes were not supposed 
> to be included in the call-graph.
> 
> 	Any ideas?
> 
> 	  Thanks in advance,
> 
> 	    cleidson rb de souza
> 
> A pessimist sees the difficulty in every opportunity; an optimist sees 
> the opportunity in every difficulty. " Winston Churchill, Sir (1874-1965)"

> import java.util.Iterator;
> import java.util.List;
> 
> import soot.*;
> import soot.jimple.toolkits.callgraph.CallGraph;
> import soot.tagkit.Tag;
> 
> public class SootTest {
> 
> 		public static void main(String args[]) {
> 
> 				String strClass = "HelloWorld";
> 
> 				//strClass is used here and also as the last param in the opts array
> 				SootClass sootClass = Scene.v().loadClassAndSupport(strClass);
> 
> 				//just seeing what some of the functions do... looks like its reading in the file correctly
> 				System.out.println("Number of methods in " + sootClass.getName() + ": " + sootClass.getMethodCount());
> 				// String[] opts = {"-W", "-app", "-f", "jimple", "-p", "jb", "use-original-names:true", "-p", "cg.spark", "on", "-p", "cg.spark",
> 				//				"simplify-offline:true","-p", "cg.spark","on-fly-cg:true", "-p", "tag.ln","enabled:true",
>                                 //"-keep-line-number", strClass};
> 				 String [] opts = {"-W", "-keep-line-number", strClass };
> 				// String[] opts = {"-w", strClass};
> 
> 				//have to set the application class
> 				System.out.println("Set Application classes");
> 				sootClass.setApplicationClass();
> 				Scene.v().setMainClass(sootClass);
> 
> 				//set the options to the static main class
> 				System.out.println("Set options to the static main class");
> 				Main.main(opts);
> 				System.out.println("Get the call graph");
> 
> 				//get the call graph
> 				CallGraph cg = Scene.v().getCallGraph();
> 				if(cg==null){
> 						System.out.println("Call graph is equal to null, exiting!");
> 				}else{
> 						System.out.println("Call graph is non null, analyzing");
> 						analyze(cg);
> 				}
> 		}
> 
> 	public static void analyze(CallGraph cg){
> 			 int i = 0;
> 
> 			 //print out what we've got.
> 			 for(Iterator iter = cg.sourceMethods(); iter.hasNext();){
> 					 SootMethod sootMethod = (SootMethod)iter.next();
> 					 System.out.println(i + " " + sootMethod.getName());
> 					 if(sootMethod.hasActiveBody()){
> 							 Body body = sootMethod.getActiveBody();
> 							 System.out.println("\t Active Body: "+body);
> 					 }else{
> 							 System.out.println("\t No Active Body Found!");
> 					 }
> 
> 					 System.out.println("\t Byte Code Signature: "+sootMethod.getBytecodeSignature());
> 					 System.out.println("\t Declaration: "+sootMethod.getDeclaration());
> 					 System.out.println("\t Declaring Class: "+sootMethod.getDeclaringClass());
> 					 System.out.println("\t Modifiers: "+sootMethod.getModifiers());
> 					 System.out.println("\t Parameter Count: "+sootMethod.getParameterCount());
> 					 System.out.println("\t Return Type: "+sootMethod.getReturnType());
> 					 System.out.println("\t Signature: "+sootMethod.getSignature());
> 					 System.out.println("\t Sourhce: "+sootMethod.getSource());
> 					 List listTags = sootMethod.getTags();
> 					 if(listTags!=null){
> 							 for(int j=0; j<listTags.size(); j++){
> 									 Tag tag = (Tag) listTags.get(i);
> 									 System.out.println("\t\tTag " +j+" " +tag.getName());
> 							 }
> 					 }
> 					   i++;
> 				}
> 
> 		}
> }