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

Constructing Call graphs without java.* classes



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++;
				}

		}
}