package test;
import java.util.*;
import jqian.sootex.dependency.pdg.*;
import jqian.sootex.dependency.slicing.GlobalSlicer;
import jqian.sootex.dependency.slicing.JavaSlicingCriterion;
import jqian.sootex.dependency.slicing.JimpleSlicingCriterion;
import jqian.sootex.location.HeapAbstraction;
import jqian.sootex.ptsto.IPtsToQuery;
import jqian.sootex.ptsto.SparkPtsToQuery;
import soot.*;
import soot.jimple.IdentityStmt;
import test.AllTestCases.SDGCases;
/**
*
*/
public class GlobalSlicingTest implements AllTestCases{
static void testEnumAllGlobalSlices(String _entry, String _testMethod){
SootMethod main = Scene.v().getMethod(_entry);
DepGraphOptions opts = new DepGraphOptions(true, true, HeapAbstraction.FIELD_SENSITIVE);
SDG sdg = SDGUtil.constructSDG(main,opts,true, -1);
sdg.buildSummaryEdges(main);
sdg.connectPDGs();
SDGUtil.showDependenceGraph(sdg, "./output/img/sdg.dot");
GlobalSlicer slicer = new GlobalSlicer(sdg);
SootMethod m = Scene.v().getMethod(_testMethod);
int i=0;
//test slicing with single statement as criterion
for(Unit unit: m.getActiveBody().getUnits()){
if(unit instanceof IdentityStmt)
continue;
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,sdg,unit.toString(),result);
i++;
}
}
static void testGlobalSliceOnCriterion(String entry, JavaSlicingCriterion criterion){
SootMethod main = Scene.v().getMethod(entry);
DepGraphOptions opts = new DepGraphOptions(true, true, HeapAbstraction.FIELD_SENSITIVE);
SDG sdg = SDGUtil.constructSDG(main,opts,true, -1);
sdg.buildSummaryEdges(main);
sdg.connectPDGs();
///SDGUtil.showDependenceGraph(sdg, "./output/dot/sdg.dot");
GlobalSlicer slicer = new GlobalSlicer(sdg);
IPtsToQuery query = new SparkPtsToQuery();
Collection<JimpleSlicingCriterion> critera = criterion.toJimpleCriterion(query, HeapAbstraction.FIELD_SENSITIVE);
Set<DependenceNode> result = slicer.slice(critera);
String filename = "./output/dot/slice.dot";
SDGUtil.showSlicingResult(filename,sdg,"",result);
}
/** Require three arguments
* java GlobalSlicerTest <slicing_type> <entry_method> <line> <var>
*
* The slicing type could be: "enum" or "with_criterion"
* specifying where the slicing criterion starts. */
/** Require two inputs, one is the line to slice, the other is the variable concerned.
* Examples aree:
*
*/
public static void main(String[] args){
JavaSlicingCriterion javaCriterion = null;
//String MAIN_CLASS = SLICE_MAIN_CLASS;
String MAIN_CLASS = SDGCases.CLASSES[2];
String entry = "";
if(args.length==0){
Collection<String> vars = new LinkedList<String>();
vars.add("m");
//vars.add("x");
javaCriterion = new JavaSlicingCriterion(vars,MAIN_CLASS,68,false);
//javaCriterion = new JavaSlicingCriterion(vars,MAIN_CLASS,48);
}
else if(args[0].equals("enum")){
//int i1 = Integer.parseInt(args[1]);
//int i2 = Integer.parseInt(args[2]);
}
else if(args[0].equals("with_criterion")){
entry = args[1];
int line = Integer.parseInt(args[2]);
String var = args[3];
Collection<String> vars = new LinkedList<String>();
vars.add(var);
//javaCriterion = new JavaSlicingCriterion(vars,MAIN_CLASS,line,true);
javaCriterion = new JavaSlicingCriterion(vars,"test.dependency.cases.SDG3$B",line,true);
}
else{
throw new RuntimeException("Bad program argument.");
}
Properties options = Test.loadConfig("/test/dependency/config.xml");
options.put("entry_class", MAIN_CLASS);
Test.loadClasses(true);
Test.doFastSparkPointsToAnalysis();
Test.simplifyCallGraph();
testGlobalSliceOnCriterion(entry, javaCriterion);
}
}