package test; import java.util.*; import jqian.sootex.Cache; import jqian.sootex.HammockCFGProvider; import jqian.sootex.dependency.pdg.*; import jqian.sootex.dependency.slicing.JavaSlicingCriterion; import jqian.sootex.dependency.slicing.JimpleSlicingCriterion; import jqian.sootex.dependency.slicing.LocalSlicer; import jqian.sootex.du.DUBuilder; import jqian.sootex.du.IGlobalDUQuery; import jqian.sootex.du.IReachingDUQuery; import jqian.sootex.location.HeapAbstraction; import jqian.sootex.ptsto.IPtsToQuery; import jqian.sootex.ptsto.SparkPtsToQuery; import jqian.sootex.ptsto.TypeBasedPtsToQuery; import jqian.sootex.sideeffect.*; import soot.*; /** * */ public class LocalSlicingTest implements AllTestCases{ static void testEnumAllLocalSlices(Collection<String> testedMethods,boolean _useSpark, boolean _ignoreCalls){ //get points-to analysis IPtsToQuery ptsto = null; if(_useSpark){ ptsto = new SparkPtsToQuery(); }else{ ptsto = new TypeBasedPtsToQuery(false); } //get side effect analysis ISideEffectAnalysis sideEffect=null; if(!_ignoreCalls){ sideEffect = Test.loadSideEffector(ptsto); } //Collection entries = new LinkedList(); //entries.add(Scene.v().getEntryPoints().get(0)); HammockCFGProvider cfgProvider = new HammockCFGProvider(); DUBuilder rdb = new DUBuilder(cfgProvider, ptsto, HeapAbstraction.FIELD_SENSITIVE, sideEffect,true); IGlobalDUQuery gbRdQuery = rdb.getGlobalDUQuery(); List<?> rm = Cache.v().getTopologicalOrder(); for(Iterator<?> it = rm.iterator();it.hasNext();){ SootMethod m = (SootMethod)it.next(); if(testedMethods.contains(m.getSignature())){ IReachingDUQuery query = gbRdQuery.getRDQuery(m); PDG pdg = Test.buildUnsafePDG(m,ptsto,query,true); LocalSlicer slicer = new LocalSlicer(pdg); int i=0; //test slicing with single statement as criterion for(Unit unit: m.getActiveBody().getUnits()){ JimpleSlicingCriterion criterion = new JimpleSlicingCriterion(m,unit,null,true); Collection<JimpleSlicingCriterion> lst = new LinkedList<JimpleSlicingCriterion>(); lst.add(criterion); Set<DependenceNode> result = slicer.slice(lst); String filename = "./output/img/slice_"+i+".dot"; SDGUtil.showSlicingResult(filename, pdg, unit.toString(),result); i++; } } } } static void testLocalSlicingOnCriterion(JavaSlicingCriterion criterion){ //initialize SDG builder DepGraphOptions opts = new DepGraphOptions(true, false, HeapAbstraction.FIELD_SENSITIVE); SootMethod entry = Scene.v().getEntryPoints().get(0); SDG sdg = SDGUtil.constructSDG(entry,opts,true, -1); //get the concerned PDG String scope = criterion.getEnclosingScope(); SootMethod domain = Scene.v().getMethod(scope); PDG pdg = sdg.getPDG(domain); LocalSlicer slicer = new LocalSlicer(pdg); IPtsToQuery query = new SparkPtsToQuery(); Collection<JimpleSlicingCriterion> criteria = criterion.toJimpleCriterion(query, HeapAbstraction.FIELD_SENSITIVE); if(criteria!=null){ Set<DependenceNode> result = slicer.slice(criteria); String filename = "./output/dot/java_slice.dot"; SDGUtil.showSlicingResult(filename, pdg, "",result); } } /** * Command line format * <test_type> [<line> <variable>] * * A test_type can be "no_criterion" or "with_criterion". * If the test_type is "with_criterion", then the line and variable should be specified * * Example test cases: (you can copy and paste it to the command line) * with_criterion 86 k * with_criterion 85 k * with_criterion 86 x */ public static void main(String[] args){ String method = SLICING_START[7]; String mainClass = SLICE_MAIN_CLASS; JavaSlicingCriterion javaCriterion = null; if(args[0].equals("no_criterion")){ } else if(args[0].equals("with_criterion")){ String var = args[2]; int line = Integer.parseInt(args[1]); Collection<String> vars = new LinkedList<String>(); vars.add(var); javaCriterion = new JavaSlicingCriterion(vars, method, line,true); } else{ throw new RuntimeException("Bad program argument."); } Properties options = Test.loadConfig("/test/dependency/config.xml"); options.put("entry_class", mainClass); Test.loadClasses(true); Test.doFastSparkPointsToAnalysis(); Test.simplifyCallGraph(); testLocalSlicingOnCriterion(javaCriterion); } }