/** * @param args */ public static void main(String[] args) { PackManager.v().getPack("jtp").add(new Transform("jtp.fixedie", new BodyTransformer() { @Override protected void internalTransform(Body b, String phaseName, Map<String, String> options) { for (Unit u : b.getUnits()) { Stmt s = (Stmt) u; if (s.containsInvokeExpr()) { InvokeExpr ie = s.getInvokeExpr(); if (FixedMethods.isFixed(ie)) { System.err.println("+++ " + ie); yes++; } else { System.err.println(" - " + ie); no++; } } } } })); soot.Main.main(args); System.err.println("+++ " + yes); System.err.println(" - " + no); }
public Transform get(String phaseName) { for (Transform tr : opts) { if (tr.getPhaseName().equals(phaseName)) { return tr; } } return null; }
protected void internalApply() { LinkedList<Transform> enableds = new LinkedList<Transform>(); for (Iterator<Transform> tIt = this.iterator(); tIt.hasNext();) { final Transform t = tIt.next(); Map<String, String> opts = PhaseOptions.v().getPhaseOptions(t); if (!PhaseOptions.getBoolean(opts, "enabled")) { continue; } enableds.add(t); } if (enableds.size() == 0) { logger .debug("" + "Exactly one phase in the pack " + getPhaseName() + " must be enabled. Currently, none of them are."); throw new CompilationDeathException(CompilationDeathException.COMPILATION_ABORTED); } if (enableds.size() > 1) { logger.debug( "" + "Only one phase in the pack " + getPhaseName() + " may be enabled. The following are enabled currently: "); for (Transform t : enableds) { logger.debug("" + " " + t.getPhaseName()); } throw new CompilationDeathException(CompilationDeathException.COMPILATION_ABORTED); } for (Transform t : enableds) { t.apply(); } }
public static void main(String[] args) { CFGViewer viewer = new CFGViewer(); Transform printTransform = new Transform(phaseFullname, viewer); printTransform.setDeclaredOptions("enabled " + altClassPathOptionName + ' ' + graphTypeOptionName + ' ' + irOptionName + ' ' + multipageOptionName + ' ' + briefLabelOptionName + ' '); printTransform.setDefaultOptions( "enabled " + altClassPathOptionName + ": " + graphTypeOptionName + ':' + defaultGraph + ' ' + irOptionName + ':' + defaultIR + ' ' + multipageOptionName + ":false " + ' ' + briefLabelOptionName + ":false "); PackManager.v().getPack("jtp").add(printTransform); args = viewer.parse_options(args); if (args.length == 0) { usage(); } else { soot.Main.main(args); } }
wjtp.add(new Transform("wjtp.jbco_fr", newTransform((Transformer) getTransform("wjtp.jbco_fr")))); if (transformsToAdd.remove("wjtp.jbco_fr")) { FieldRenamer.v().setRenameFields(true); wjtp.add(new Transform("wjtp.jbco_cc", newTransform((Transformer) getTransform("wjtp.jbco_cc")))); if (transformsToAdd.get(i).startsWith("bb")) { jl = "jtp.jbco_jl"; jtp.add(new Transform(jl, newTransform((Transformer) getTransform(jl)))); bb.insertBefore(new Transform("bb.jbco_j2bl", newTransform((Transformer) getTransform("bb.jbco_j2bl"))), "bb.lso"); bb.insertBefore(new Transform("bb.jbco_ful", newTransform((Transformer) getTransform("bb.jbco_ful"))), "bb.lso"); bb.add(new Transform("bb.jbco_rrps", newTransform((Transformer) getTransform("bb.jbco_rrps")))); String insertBefore = p == jtp ? jl : p == bb ? "bb.jbco_ful" : null; if (insertBefore != null) { p.insertBefore(new Transform(tname, newTransform((Transformer) t)), insertBefore); } else { p.add(new Transform(tname, newTransform((Transformer) t))); if (((Transform) phases.next()).getPhaseName().indexOf("jbco") > 0) { argv = checkWhole(argv, true); break; while (phases.hasNext()) { Transform o = (Transform) phases.next(); Transformer t = o.getTransformer(); if (t instanceof IJbcoTransform) { logger.debug("\t" + ((IJbcoTransform) t).getName() + " JBCO"); } else {
protected void internalApply() { for (Transform t : this) { t.apply(); } } }
new Transform(pack + ".ifds", new PropagationSceneTransformer(resultBuilder, new PropagationSceneTransformerFilePrinter(debugFilename, new SymbolFilter() { @Override Object current = it.next(); if (current instanceof Transform && ((Transform) current).getPhaseName().equals(pack + ".ifds")) { it.remove(); break;
protected void internalApply(Body b) { for (Iterator<Transform> tIt = this.iterator(); tIt.hasNext();) { final Transform t = tIt.next(); if (Options.v().interactive_mode()) { // logger.debug("sending transform: "+t.getPhaseName()+" for body: "+b+" for body pack: "+this.getPhaseName()); InteractionHandler.v().handleNewAnalysis(t, b); } t.apply(b); if (Options.v().interactive_mode()) { InteractionHandler.v().handleTransformDone(t, b); } } }
/** * Loads the phase plugin and adds it to PackManager. * * @param pluginDescription * the plugin description instance read from configuration file. */ private static void handlePhasePlugin(final PhasePluginDescription pluginDescription) { try { final Object instance = PluginLoader.loadStrategy.create(pluginDescription.getClassName()); if (!(instance instanceof SootPhasePlugin)) { throw new RuntimeException( "The plugin class '" + pluginDescription.getClassName() + "' does not implement SootPhasePlugin."); } final SootPhasePlugin phasePlugin = (SootPhasePlugin) instance; phasePlugin.setDescription(pluginDescription); final String packName = getPackName(pluginDescription.getPhaseName()); Transform transform = new Transform(pluginDescription.getPhaseName(), phasePlugin.getTransformer()); transform.setDeclaredOptions(concat(appendEnabled(phasePlugin.getDeclaredOptions()))); transform.setDefaultOptions(concat(phasePlugin.getDefaultOptions())); PackManager.v().getPack(packName).add(transform); } catch (final ClassNotFoundException e) { throw new RuntimeException("Failed to load plugin class for " + pluginDescription + ".", e); } catch (final InstantiationException e) { throw new RuntimeException("Failed to instanciate plugin class for " + pluginDescription + ".", e); } }
/** * @param args */ public static void main(String[] args) { PackManager.v().getPack("wjtp").add(new Transform("wjtp.ifds", new SceneTransformer() { protected void internalTransform(String phaseName, @SuppressWarnings("rawtypes") Map options) { IFDSTabulationProblem<Unit, ?, SootMethod, InterproceduralCFG<Unit, SootMethod>> problem = new IFDSPossibleTypes(new JimpleBasedInterproceduralCFG()); @SuppressWarnings({ "rawtypes", "unchecked" }) JimpleIFDSSolver<?, InterproceduralCFG<Unit, SootMethod>> solver = new JimpleIFDSSolver(problem); solver.solve(); } })); soot.Main.main(args); }
public boolean remove(String phaseName) { for (Transform tr : opts) { if (tr.getPhaseName().equals(phaseName)) { opts.remove(tr); return true; } } return false; }
protected void internalApply() { LinkedList<Transform> enableds = new LinkedList<Transform>(); for( Iterator tIt = this.iterator(); tIt.hasNext(); ) { final Transform t = (Transform) tIt.next(); Map opts = PhaseOptions.v().getPhaseOptions( t ); if( !PhaseOptions.getBoolean( opts, "enabled" ) ) continue; enableds.add( t ); } if( enableds.size() == 0 ) { G.v().out.println( "Exactly one phase in the pack "+getPhaseName()+ " must be enabled. Currently, none of them are." ); throw new CompilationDeathException( CompilationDeathException.COMPILATION_ABORTED ); } if( enableds.size() > 1 ) { G.v().out.println( "Only one phase in the pack "+getPhaseName()+ " may be enabled. The following are enabled currently: " ); for (Transform t : enableds) { G.v().out.println( " "+t.getPhaseName() ); } throw new CompilationDeathException( CompilationDeathException.COMPILATION_ABORTED ); } for (Transform t : enableds) { t.apply(); } }
PackManager.v().getTransform("jj.ls").apply(b); PackManager.v().getTransform("jj.a").apply(b); PackManager.v().getTransform("jj.ule").apply(b); PackManager.v().getTransform("jj.ne").apply(b); PackManager.v().getTransform("jj.tr").apply(b); PackManager.v().getTransform("jj.ulp").apply(b); PackManager.v().getTransform("jj.lns").apply(b); PackManager.v().getTransform("jj.cp").apply(b); PackManager.v().getTransform("jj.dae").apply(b); PackManager.v().getTransform("jj.cp-ule").apply(b); PackManager.v().getTransform("jj.lp").apply(b); PackManager.v().getTransform("jj.uce").apply(b);
private void registerGuard(SootMethod container, Stmt stmt, String string) { guards.add(new Guard(container, stmt, string)); if (options.verbose()) { logger.debug("Incomplete trace file: Class.forName() is called in method '" + container + "' but trace contains no information about the receiver class of this call."); if (options.guards().equals("ignore")) { logger.debug("Guarding strategy is set to 'ignore'. Will ignore this problem."); } else if (options.guards().equals("print")) { logger.debug("Guarding strategy is set to 'print'. " + "Program will print a stack trace if this location is reached during execution."); } else if (options.guards().equals("throw")) { logger.debug("Guarding strategy is set to 'throw'. Program will throw an " + "Error if this location is reached during execution."); } else { throw new RuntimeException("Invalid value for phase option (guarding): " + options.guards()); } } if (!registeredTransformation) { registeredTransformation = true; PackManager.v().getPack("wjap").add(new Transform("wjap.guards", new SceneTransformer() { @Override protected void internalTransform(String phaseName, Map<String, String> options) { for (Guard g : guards) { insertGuard(g); } } })); PhaseOptions.v().setPhaseOption("wjap.guards", "enabled"); } }
public void add(Transform t) { if (!t.getPhaseName().startsWith(getPhaseName() + ".")) { throw new RuntimeException("Transforms in pack '" + getPhaseName() + "' must have a phase name " + "that starts with '" + getPhaseName() + ".'."); } PhaseOptions.v().getPM().notifyAddPack(); if (get(t.getPhaseName()) != null) { throw new RuntimeException("Phase " + t.getPhaseName() + " already " + "in pack"); } opts.add(t); }
protected void internalApply() { LinkedList<Transform> enableds = new LinkedList<Transform>(); for( Iterator tIt = this.iterator(); tIt.hasNext(); ) { final Transform t = (Transform) tIt.next(); Map opts = PhaseOptions.v().getPhaseOptions( t ); if( !PhaseOptions.getBoolean( opts, "enabled" ) ) continue; enableds.add( t ); } if( enableds.size() == 0 ) { G.v().out.println( "Exactly one phase in the pack "+getPhaseName()+ " must be enabled. Currently, none of them are." ); throw new CompilationDeathException( CompilationDeathException.COMPILATION_ABORTED ); } if( enableds.size() > 1 ) { G.v().out.println( "Only one phase in the pack "+getPhaseName()+ " may be enabled. The following are enabled currently: " ); for (Transform t : enableds) { G.v().out.println( " "+t.getPhaseName() ); } throw new CompilationDeathException( CompilationDeathException.COMPILATION_ABORTED ); } for (Transform t : enableds) { t.apply(); } }
PackManager.v().getTransform("jb.tt").apply(b); // TrapTigthener PackManager.v().getTransform("jb.dtr").apply(b); // DuplicateCatchAllTrapRemover PackManager.v().getTransform("jb.uce").apply(b); PackManager.v().getTransform("jb.ls").apply(b); PackManager.v().getTransform("jb.a").apply(b); PackManager.v().getTransform("jb.ule").apply(b); PackManager.v().getTransform("jb.tr").apply(b); PackManager.v().getTransform("jb.ulp").apply(b); PackManager.v().getTransform("jb.lns").apply(b); // LocalNameStandardizer PackManager.v().getTransform("jb.cp").apply(b); // CopyPropagator PackManager.v().getTransform("jb.dae").apply(b); // DeadAssignmentElimintaor PackManager.v().getTransform("jb.cp-ule").apply(b); // UnusedLocalEliminator PackManager.v().getTransform("jb.lp").apply(b); // LocalPacker PackManager.v().getTransform("jb.ne").apply(b); // NopEliminator PackManager.v().getTransform("jb.uce").apply(b); // UnreachableCodeEliminator: Again, we might have new dead code PackManager.v().getTransform("jb.lns").apply(b);
public static void main(String[] args) { PackManager.v().getPack("wjpp").add(new Transform("wjpp.inlineReflCalls", new ReflectiveCallsInliner())); Scene.v().addBasicClass(Object.class.getName()); Scene.v().addBasicClass(SootSig.class.getName(), SootClass.BODIES);
public void insertAfter(Transform t, String phaseName) { PhaseOptions.v().getPM().notifyAddPack(); for (Transform tr : opts) { if (tr.getPhaseName().equals(phaseName)) { opts.insertAfter(t, tr); return; } } throw new RuntimeException("phase " + phaseName + " not found!"); }