package test; import java.util.Collection; import java.util.Properties; import soot.Body; import soot.Scene; import soot.SootMethod; import soot.Unit; import soot.toolkits.graph.DominatorTree; import soot.toolkits.graph.MHGPostDominatorsFinder; import soot.toolkits.graph.UnitGraph; import test.Test; import jqian.sootex.CFGProvider; import jqian.sootex.HammockCFGProvider; import jqian.sootex.dependency.DependencyQuery; import jqian.sootex.du.IGlobalDUQuery; import jqian.sootex.ptsto.IPtsToQuery; import jqian.sootex.ptsto.SparkPtsToQuery; import jqian.sootex.ptsto.TypeBasedPtsToQuery; import jqian.sootex.util.SootUtils; import jqian.sootex.util.graph.DominatorTreeGraph; import jqian.sootex.util.graph.GraphHelper; import jqian.util.graph.Graph; /** * */ public class DependencyQueryTest implements AllTestCases{ static void test(String pta, String methodSignature){ IPtsToQuery ptsto; if(pta.equals("type-based")){ ptsto = new TypeBasedPtsToQuery(false); } else{ ptsto = new SparkPtsToQuery(); } CFGProvider cfgProvider = new HammockCFGProvider(); IGlobalDUQuery duQuery = Test.createDUQuery(ptsto, cfgProvider, true); DependencyQuery depQuery = new DependencyQuery(duQuery, cfgProvider); SootMethod m = Scene.v().getMethod(methodSignature); Test.out.println("Testing DependencyQuery for method: " + m); UnitGraph cfg = cfgProvider.getCFG(m); Test.showCFG(m,cfg, "jgraph"); if(_showDominatorTree){ MHGPostDominatorsFinder postdomFinder = new MHGPostDominatorsFinder(cfg); DominatorTree postdomTree = new DominatorTree(postdomFinder); DominatorTreeGraph graph = new DominatorTreeGraph(postdomTree); Graph displayedCallgraph = GraphHelper.toDisplayGraph(graph, "Dominator Tree Graph"); Test.showGraph(displayedCallgraph, "jgraph"); } Body body = m.retrieveActiveBody(); for(Unit u: body.getUnits()){ Collection<Unit> cd = depQuery.getCtrlDependences(m, u); Collection<Unit> rwd = depQuery.getRWDependences(m, u); Collection<Unit> wrd = depQuery.getWRDependences(m, u); Collection<Unit> wwd = depQuery.getWWDependences(m, u); Test.out.println("\n[Stmt] " + SootUtils.getStmtString(u)); printDependences("Control dependences:", cd); printDependences("Flow dependences", wrd); printDependences("Anti Dependences", rwd); printDependences("Output Dependences", wwd); } } static void printDependences(String hint, Collection<Unit> dep){ Test.out.println(); Test.out.println(hint); for(Unit u: dep){ Test.out.println(" -> " + SootUtils.getStmtString(u)); } } static boolean _showDominatorTree = false; public static void main(String[] args) { String pta = "spark"; Properties conf = Test.loadConfig("/test/dependency/config.xml"); conf.put("entry_class", DepQuery.MAIN_CLASS); Test.loadClasses(true); if(!pta.equals("type-based")){ //SootUtils.doSparkPointsToAnalysis(Collections.EMPTY_MAP); Test.doFastSparkPointsToAnalysis(); Test.simplifyCallGraph(); } //test(pta, CTRL_DEPENDENCE_QUERY[1]); //test(pta, FLOW_DEPENDENCE_QUERY[4]); //test(pta, ANTI_DEPENDENCE_QUERY[2]); test(pta, DepQuery.OUTPUT_DEPENDENCE_QUERY[1]); } }