import soot.Body; import soot.Main; import soot.Pack; import soot.PackManager; import soot.Transform; import soot.Unit; import soot.tagkit.StringTag; import soot.toolkits.scalar.ArraySparseSet; import soot.toolkits.graph.BriefUnitGraph; public class NullnessDriver { public static void main(String[] argv) { Pack jtp = soot.G.v().PackManager().getPack("jtp"); jtp.add(new Transform("jtp.nt", new NullTransformer())); jtp.add(new Transform("jtp.nac", new NullnessAnalysisColorer())); soot.Main.main(argv); } } class NullTransformer extends soot.BodyTransformer { protected void internalTransform(Body b, String phaseName, java.util.Map options) { NullnessAnalysis na = new NullnessAnalysis(new BriefUnitGraph(b)); java.util.Iterator uIt = b.getUnits().iterator(); while (uIt.hasNext()) { Unit u = (Unit)uIt.next(); StringBuffer n = new StringBuffer(); u.addTag(new StringTag("IN: "+na.getFlowBefore(u).toString())); if (u.fallsThrough()) { ArraySparseSet s = (ArraySparseSet)na.getFallFlowAfter(u); u.addTag(new StringTag("FALL: "+s.toString())); } if (u.branches()) { ArraySparseSet t = (ArraySparseSet)na. getBranchFlowAfter(u).get(0); u.addTag(new StringTag("BRANCH: "+t.toString())); } } } }