package test;
import java.util.*;
import jqian.sootex.CFGProvider;
import jqian.sootex.HammockCFGProvider;
import jqian.sootex.du.IGlobalDUQuery;
import jqian.sootex.du.IReachingDUQuery;
import jqian.sootex.ptsto.IPtsToQuery;
import jqian.sootex.ptsto.SparkPtsToQuery;
import jqian.sootex.ptsto.TypeBasedPtsToQuery;
import jqian.sootex.util.CFGEntry;
import jqian.sootex.util.CFGExit;
import jqian.sootex.util.SootUtils;
import soot.*;
import soot.toolkits.graph.*;
import soot.toolkits.scalar.*;
public class DUBuilderTest implements AllTestCases {
static void testRD(IPtsToQuery ptsto, Set<String> methodSignatures) {
CFGProvider cfgProvider = new HammockCFGProvider();
IGlobalDUQuery duQuery = Test.createDUQuery(ptsto, cfgProvider, _buildAll);
for(String signature: methodSignatures){
SootMethod m = Scene.v().getMethod(signature);
IReachingDUQuery dq = duQuery.getRDQuery(m);
testDUOnMethod("RD",dq, m);
if(_showCfg){
UnitGraph cfg = cfgProvider.getCFG(m);
Test.showCFG(m,cfg, "jgraph");
}
if (_showPDG) {
Test.buildUnsafePDG(m, ptsto, dq, false);
}
}
}
static void testRU(IPtsToQuery ptsto, Set<String> methodSignatures) {
CFGProvider cfgProvider = new HammockCFGProvider();
IGlobalDUQuery duQuery = Test.createDUQuery(ptsto, cfgProvider, _buildAll);
for(String signature: methodSignatures){
SootMethod m = Scene.v().getMethod(signature);
IReachingDUQuery uq = duQuery.getRUQuery(m);
testDUOnMethod("RU",uq, m);
if(_showCfg){
UnitGraph cfg = cfgProvider.getCFG(m);
Test.showCFG(m,cfg, "jgraph");
}
}
}
static void testDUOnMethod(String hint,IReachingDUQuery query,SootMethod m){
Test.out.println("\n=============== "+hint+" of "+m.getName()+"===================");
for (Unit n: m.getActiveBody().getUnits()) {
Test.out.println("\n\n[Stmt("+SootUtils.getLine(n)+")] "+n.toString());
testInOut(query,n);
}
Test.out.println("\n\nStmt: entry");
testInOut(query,CFGEntry.v());
Test.out.println("\n\nStmt: exit");
testInOut(query,CFGExit.v());
}
@SuppressWarnings({ "unchecked", "rawtypes" })
static void testInOut(IReachingDUQuery rd,Unit stmt){
ForwardFlowAnalysis ffa = (ForwardFlowAnalysis)rd;
Object in = ffa.getFlowBefore(stmt);
showDUSet("IN set",in);
//Object out = ffa.getFlowAfter(stmt);
//showDUSet("OUT set",out);
}
static void showDUSet(String hind,Object set){
if(set==null){
Test.out.println(hind + ": None");
return;
}
int size = 0;
Iterator<?> it = null;
if(set instanceof FlowSet){
FlowSet fin = (FlowSet)set;
it = fin.iterator();
size = fin.size();
}
else{
Collection<?> cin = (Collection<?>)set;
it = cin.iterator();
size = cin.size();
}
Test.out.println(hind+"("+size+")");
Test.printCollection(it,"\n");
}
public static boolean _showCfg = true;
public static boolean _showPDG = true;
public static boolean _buildAll = true;
public static void main(String[] args) {
boolean useTypeBasedPtsToAnalysis = false;
//if(args.length!=1){
// Test.out.println("Usage: java SideEffectTest <checked_method_signature>");
// return;
//}
Properties conf = Test.loadConfig("/test/config.xml");
//conf.put("entry_class", RD_MAIN_CLASS);
//conf.put("entry_class", RU.MAIN_CLASS);
conf.put("entry_class", "test.cases.SDG3");
Test.loadClasses(true);
if(!useTypeBasedPtsToAnalysis){
//SootUtils.doSparkPointsToAnalysis(Collections.EMPTY_MAP);
Test.doFastSparkPointsToAnalysis();
Test.simplifyCallGraph();
}
Set<String> methodSigatures = new HashSet<String>();
//methodSigatures.add(RD_LOCAL[0]);
//methodSigatures.add(RD_LOCAL[1]);
//methodSigatures.add(RD_LOCAL[2]);
//methodSigatures.add(RD_LOCAL[3]);
//methodSigatures.add(RD_LOCAL[4]);
//methodSigatures.add(RD_INTERPROC[0]);
//methodSigatures.add(RD_INTERPROC[1]);
//methodSigatures.add(RD_INTERPROC[2]);
//methodSigatures.add(RU_LOCAL[0]);
//methodSigatures.add(RU_LOCAL[1]);
//methodSigatures.add(RU_LOCAL[2]);
//methodSigatures.add(RU_LOCAL[3]);
//methodSigatures.add(RU_LOCAL[4]);
//methodSigatures.add(RD_INTERPROC[0]);
//methodSigatures.add(RD_INTERPROC[1]);
//methodSigatures.add(RD_INTERPROC[2]);
methodSigatures.add("<test.cases.SDG3: void test1()>");
IPtsToQuery query;
if(useTypeBasedPtsToAnalysis){
query = new TypeBasedPtsToQuery(false);
}
else{
query = new SparkPtsToQuery();
}
testRD(query, methodSigatures);
//testRU(query, methodSigatures);
}
}