[Soot-list] inter-procedural analysis on an android app

daniela antonova daniela.antonova at gmail.com
Wed Jan 5 16:23:09 EST 2011


Hi,

Thanks for your help. I set the entry points, by getting the onCreate
method from the class analysed (AddressBook2):
                Scene scene = Scene.v();
		SootClass addrBook = scene.loadClassAndSupport("testers.AddressBook2");
		scene.loadNecessaryClasses();
		addrBook.setApplicationClass();
		SootMethod onCreate = addrBook.getMethodByName("onCreate");
		
		List<SootMethod> entryPoints = Arrays.asList(onCreate);
		Scene.v().setEntryPoints(entryPoints);
		
However, I now get a weird exception:

Exception in thread "main" java.lang.RuntimeException: This operation
requires resolving level BODIES but
android.provider.ContactsContract$Contacts is at resolving level
SIGNATURES
If you are extending Soot, try to add the following call before
calling soot.Main.main(..):
Scene.v().addBasicClass(android.provider.ContactsContract$Contacts,BODIES);
Otherwise, try whole-program mode (-w).
	at soot.SootClass.checkLevel(SootClass.java:121)
	at soot.SootMethod.retrieveActiveBody(SootMethod.java:305)
	at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processNewMethod(OnFlyCallGraphBuilder.java:526)
	at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processReachables(OnFlyCallGraphBuilder.java:426)
	at soot.jimple.toolkits.callgraph.CallGraphBuilder.build(CallGraphBuilder.java:84)
	at soot.jimple.toolkits.callgraph.CHATransformer.internalTransform(CHATransformer.java:43)
	at soot.SceneTransformer.transform(SceneTransformer.java:39)
	at soot.Transform.apply(Transform.java:89)
	at soot.RadioScenePack.internalApply(RadioScenePack.java:57)
	at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:47)
	at soot.Pack.apply(Pack.java:114)
	at soot.PackManager.runWholeProgramPacks(PackManager.java:408)
	at soot.PackManager.runPacks(PackManager.java:329)
	at soot.Main.run(Main.java:198)
	at soot.Main.main(Main.java:141)
	at RunInterProceduralAnalysis.main(RunInterProceduralAnalysis.java:92)

I am not quite sure what is going on, as I am already using the
whole-program mode.
Could you please give me a hint as to whether I am on the right track?
I have pasted my code below.

Thanks a lot!
Daniela

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.AddressBook2",//main-class
				"testers.AddressBook2"//argument classes
		}));

		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.AddressBook2");
					
				SootMethod src = Scene.v().getMainClass().getMethodByName("onCreate");
				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 scene = Scene.v();
		SootClass addrBook = scene.loadClassAndSupport("testers.AddressBook2");
		scene.loadNecessaryClasses();
		addrBook.setApplicationClass();
		SootMethod onCreate = addrBook.getMethodByName("onCreate");
		
		List<SootMethod> entryPoints = Arrays.asList(onCreate);
		Scene.v().setEntryPoints(entryPoints);
		
		soot.Main.main(args);
	}


More information about the Soot-list mailing list