private static void setOptions(String mainclass, boolean isJPF) { PhaseOptions.v().setPhaseOption("jb", "enabled:true"); PhaseOptions.v().setPhaseOption("tag.ln", "on"); Options.v().set_keep_line_number(true); Options.v().setPhaseOption("jb", "use-original-names:true"); Options.v().set_app(true); Options.v().set_whole_program(true); if (isJPF) { // Enable Spark HashMap<String, String> opt = new HashMap<String, String>(); // opt.put("verbose","true"); opt.put("propagator", "worklist"); opt.put("simple-edges-bidirectional", "false"); opt.put("on-fly-cg", "true"); opt.put("set-impl", "double"); opt.put("double-set-old", "hybrid"); opt.put("double-set-new", "hybrid"); opt.put("pre_jimplify", "true"); SparkTransformer.v().transform("", opt); PhaseOptions.v().setPhaseOption("cg.spark", "enabled:true"); Scene.v() .setSootClassPath( System.getProperty("sun.boot.class.path") + File.pathSeparator + System.getProperty("java.class.path")); } List excludes = new ArrayList(); excludes.add("org.eclipse."); excludes.add("javax."); excludes.add("java."); excludes.add("pt.tecnico."); Options.v().set_exclude(excludes); List includes = new ArrayList(); includes.add("org.apache.commons.pool."); // pool107 includes.add("org.apache.log4j."); // log4j_3 includes.add("org.apache.commons.lang."); // lang Options.v().set_include(includes); SootClass appclass = Scene.v().loadClassAndSupport(mainclass); try { Scene.v().setMainClass(appclass); Scene.v().getMainClass(); } catch (Exception e) { System.out.println(">> Exception [No main class]: " + e.getMessage()); } }
public OnFlyCallGraph(PAG pag) { this.pag = pag; CGOptions options = new CGOptions(PhaseOptions.v().getPhaseOptions("cg")); if (options.all_reachable()) { List entryPoints = new ArrayList(); entryPoints.addAll(EntryPoints.v().all()); entryPoints.addAll(EntryPoints.v().methodsOfApplicationClasses()); Scene.v().setEntryPoints(entryPoints); } callGraph = new CallGraph(); Scene.v().setCallGraph(callGraph); ContextManager cm = CallGraphBuilder.makeContextManager(callGraph); reachableMethods = Scene.v().getReachableMethods(); ofcgb = new OnFlyCallGraphBuilder(cm, reachableMethods); reachablesReader = reachableMethods.listener(); callEdges = cm.callGraph().listener(); }