soot.jimple.toolkits.callgraph.CallGraph Java Examples
The following examples show how to use
soot.jimple.toolkits.callgraph.CallGraph.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: ThrowRiskTf.java From Decca with MIT License | 7 votes |
@Override protected void internalTransform(String phaseName, Map option) { Map<String, String> cgMap = new HashMap<String, String>(); cgMap.put("enabled", "true"); cgMap.put("apponly", "true"); List<SootMethod> entryMthds = new ArrayList<SootMethod>(); for (SootClass sootClass : Scene.v().getApplicationClasses()) { if (entryClses.contains(sootClass.getName())) {// entry class for (SootMethod method : sootClass.getMethods()) { entryMthds.add(method); } } } Scene.v().setEntryPoints(entryMthds); CHATransformer.v().transform("wjtp", cgMap); CallGraph cg = Scene.v().getCallGraph(); Iterator<Edge> ite = cg.iterator(); riskMthds = getRiskMthds(); while (ite.hasNext()) { Edge edge = ite.next(); if (isRiskCall(edge)) { riskRlts.add(new MethodCall(edge.src().getSignature(), edge.tgt().getSignature())); } } }
Example #2
Source File: SootCg.java From Decca with MIT License | 6 votes |
public Graph getGraph() { Set<Node> nds = new HashSet<Node>(); List<MethodCall> calls = new ArrayList<MethodCall>(); // form calls and nds CallGraph cg = Scene.v().getCallGraph(); if (cg != null) { Iterator<Edge> ite = cg.iterator(); while (ite.hasNext()) { Edge edge = ite.next(); if (Conf.FLT_INTERFACE) { if (edge.kind().name().equals("INTERFACE")) continue; } String srcClsName = edge.src().getDeclaringClass().getName(); String tgtClsName = edge.tgt().getDeclaringClass().getName(); if (entryClses.contains(tgtClsName)) { // edge to entry-jar } else if (conflictJarClses.contains(srcClsName)) { // edge from conflict-jar } else { String tgtMthdName = edge.tgt().getSignature(); String srcMthdName = edge.src().getSignature(); calls.add(new MethodCall(srcMthdName, tgtMthdName)); nds.add(new Node(srcMthdName, entryClses.contains(srcClsName))); nds.add(new Node(tgtMthdName, entryClses.contains(tgtClsName))); } } } return new Graph(nds, calls); }
Example #3
Source File: MultiCalledMethods.java From JAADAS with GNU General Public License v3.0 | 5 votes |
private void byMCalledS0(PegCallGraph pcg) { Iterator it = pcg.iterator(); while (it.hasNext()){ SootMethod sm = (SootMethod)it.next(); UnitGraph graph = new CompleteUnitGraph(sm.getActiveBody()); CallGraph callGraph = Scene.v().getCallGraph(); MultiRunStatementsFinder finder = new MultiRunStatementsFinder(graph, sm, multiCalledMethods, callGraph); FlowSet fs = finder.getMultiRunStatements(); } }
Example #4
Source File: ObservableDynamicICFG.java From SPDS with Eclipse Public License 2.0 | 5 votes |
@Override public void resetCallGraph() { demandDrivenCallGraph = new CallGraph(); numberOfEdgesTakenFromPrecomputedCallGraph = 0; unbalancedMethods.clear(); calleeListeners.clear(); callerListeners.clear(); }
Example #5
Source File: ObservableDynamicICFG.java From SPDS with Eclipse Public License 2.0 | 5 votes |
public CallGraph getCallGraphCopy() { CallGraph copy = new CallGraph(); for (Edge edge : demandDrivenCallGraph) { Edge edgeCopy = new Edge(edge.src(), edge.srcUnit(), edge.tgt(), edge.kind()); copy.addEdge(edgeCopy); } return copy; }
Example #6
Source File: ObservableStaticICFG.java From SPDS with Eclipse Public License 2.0 | 5 votes |
private void addEdgesForCallees(SootMethod sootMethod, HashSet<SootMethod> visited, CallGraph copy) { visited.add(sootMethod); for (Unit callsite : precomputedGraph.getCallsFromWithin(sootMethod)) { for (SootMethod callee : precomputedGraph.getCalleesOfCallAt(callsite)) { copy.addEdge(new Edge(sootMethod, (Stmt) callsite, callee)); if (!visited.contains(callee)) { addEdgesForCallees(callee, visited, copy); } } } }
Example #7
Source File: ObservableStaticICFG.java From SPDS with Eclipse Public License 2.0 | 5 votes |
public CallGraph getCallGraphCopy() { CallGraph copy = new CallGraph(); HashSet<SootMethod> visited = new HashSet<>(); for (SootMethod entryPoint : Scene.v().getEntryPoints()) { if (!visited.contains(entryPoint)) { addEdgesForCallees(entryPoint, visited, copy); } } return copy; }
Example #8
Source File: MultiRunStatementsFinder.java From JAADAS with GNU General Public License v3.0 | 5 votes |
public MultiRunStatementsFinder(UnitGraph g, SootMethod sm, Set<SootMethod> multiCalledMethods, CallGraph cg) { super(g); nodeToIndex = new HashMap<Object, Integer>(); // System.out.println("===entering MultiObjectAllocSites=="); doAnalysis(); //testMultiObjSites(sm); findMultiCalledMethodsIntra(multiCalledMethods, cg); // testMultiObjSites(sm); }
Example #9
Source File: InfoFlowAnalysis.java From JAADAS with GNU General Public License v3.0 | 5 votes |
protected HashMutableDirectedGraph<EquivalentValue> getInvokeInfoFlowSummary( InvokeExpr ie, Stmt is, SootMethod context) { // get the data flow graph for each possible target of ie, // then combine them conservatively and return the result. HashMutableDirectedGraph<EquivalentValue> ret = null; SootMethodRef methodRef = ie.getMethodRef(); String subSig = methodRef.resolve().getSubSignature(); CallGraph cg = Scene.v().getCallGraph(); for(Iterator<Edge> edges = cg.edgesOutOf(is); edges.hasNext();) { Edge e = edges.next(); SootMethod target = e.getTgt().method(); // Verify that this target is an implementation of the method we intend to call, // and not just a class initializer or other unintended control flow. if(target.getSubSignature().equals(subSig)) { HashMutableDirectedGraph<EquivalentValue> ifs = getMethodInfoFlowSummary( target, context.getDeclaringClass().isApplicationClass()); if(ret == null) ret = ifs; else { for(EquivalentValue node : ifs.getNodes()) { if(!ret.containsNode(node)) ret.addNode(node); for(EquivalentValue succ : ifs.getSuccsOf(node)) ret.addEdge(node, succ); } } } } return ret; // return getMethodInfoFlowSummary(methodRef.resolve(), context.getDeclaringClass().isApplicationClass()); }
Example #10
Source File: SootInfo.java From JAADAS with GNU General Public License v3.0 | 5 votes |
public static int countCallEdgesForCallsite(Stmt callsite, boolean stopForMutiple) { CallGraph cg = Scene.v().getCallGraph(); int count = 0; for ( Iterator<Edge> it = cg.edgesOutOf(callsite); it.hasNext(); ) { it.next(); ++count; if ( stopForMutiple && count > 1) break; } return count; }
Example #11
Source File: Scene.java From JAADAS with GNU General Public License v3.0 | 5 votes |
public CallGraph getCallGraph() { if(!hasCallGraph()) { throw new RuntimeException( "No call graph present in Scene. Maybe you want Whole Program mode (-w)." ); } return activeCallGraph; }
Example #12
Source File: CallGraphExample.java From JAADAS with GNU General Public License v3.0 | 5 votes |
public static void main(String[] args) { List<String> argsList = new ArrayList<String>(Arrays.asList(args)); argsList.addAll(Arrays.asList(new String[]{ "-w", "-main-class", "testers.CallGraphs",//main-class "testers.CallGraphs",//argument classes "testers.A" // })); PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans", new SceneTransformer() { @Override protected void internalTransform(String phaseName, Map options) { CHATransformer.v().transform(); SootClass a = Scene.v().getSootClass("testers.A"); SootMethod src = Scene.v().getMainClass().getMethodByName("doStuff"); CallGraph cg = Scene.v().getCallGraph(); Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src)); while (targets.hasNext()) { SootMethod tgt = (SootMethod)targets.next(); System.out.println(src + " may call " + tgt); } } })); args = argsList.toArray(new String[0]); soot.Main.main(args); }
Example #13
Source File: LocalMustAliasAnalysis.java From JAADAS with GNU General Public License v3.0 | 4 votes |
/** * Computes the set of {@link EquivalentValue}s of all field references that are used * in this method but not set by the method or any method transitively called by this method. */ private Set<Value> trackableFields() { Set<Value> usedFieldRefs = new HashSet<Value>(); //add all field references that are in use boxes for (Unit unit : this.graph) { Stmt s = (Stmt) unit; List<ValueBox> useBoxes = s.getUseBoxes(); for (ValueBox useBox : useBoxes) { Value val = useBox.getValue(); if(val instanceof FieldRef) { FieldRef fieldRef = (FieldRef) val; if(fieldRef.getType() instanceof RefLikeType) usedFieldRefs.add(new EquivalentValue(fieldRef)); } } } //prune all fields that are written to if(!usedFieldRefs.isEmpty()) { if(!Scene.v().hasCallGraph()) { throw new IllegalStateException("No call graph found!"); } CallGraph cg = Scene.v().getCallGraph(); ReachableMethods reachableMethods = new ReachableMethods(cg,Collections.<MethodOrMethodContext>singletonList(container)); reachableMethods.update(); for (Iterator<MethodOrMethodContext> iterator = reachableMethods.listener(); iterator.hasNext();) { SootMethod m = (SootMethod) iterator.next(); if(m.hasActiveBody() && //exclude static initializer of same class (assume that it has already been executed) !(m.getName().equals(SootMethod.staticInitializerName) && m.getDeclaringClass().equals(container.getDeclaringClass()))) { for (Unit u : m.getActiveBody().getUnits()) { List<ValueBox> defBoxes = u.getDefBoxes(); for (ValueBox defBox : defBoxes) { Value value = defBox.getValue(); if(value instanceof FieldRef) { usedFieldRefs.remove(new EquivalentValue(value)); } } } } } } return usedFieldRefs; }
Example #14
Source File: GeomEvaluator.java From JAADAS with GNU General Public License v3.0 | 4 votes |
/** * Report the virtual callsites resolution result for the user's code. */ public void checkCallGraph() { int[] limits = new int[] { 1, 2, 4, 8 }; evalRes.total_call_edges = new Histogram(limits); CallGraph cg = Scene.v().getCallGraph(); for ( Stmt callsite : ptsProvider.multiCallsites ) { Iterator<Edge> edges = cg.edgesOutOf(callsite); if ( !edges.hasNext() ) continue; evalRes.n_callsites++; // get an edge Edge anyEdge = edges.next(); SootMethod src = anyEdge.src(); if ( !ptsProvider.isReachableMethod(src) || !ptsProvider.isValidMethod(src) ) continue; // get the base pointer CgEdge p = ptsProvider.getInternalEdgeFromSootEdge(anyEdge); LocalVarNode vn = (LocalVarNode)p.base_var; // test the call graph int edge_cnt = 1; while ( edges.hasNext() ) { ++edge_cnt; edges.next(); } evalRes.n_geom_call_edges += edge_cnt; if ( edge_cnt == 1 ) ++evalRes.n_geom_solved_all; // test app method if ( !src.isJavaLibraryMethod() ) { InvokeExpr ie = callsite.getInvokeExpr(); if ( edge_cnt == 1 ) { ++evalRes.n_geom_solved_app; if ( ptsProvider.getOpts().verbose() ) { outputer.println(); outputer.println("<<<<<<<<< Additional Solved Call >>>>>>>>>>"); outputer.println(src.toString()); outputer.println(ie.toString()); } } else { // We try to test if this callsite is solvable // under some contexts Histogram call_edges = new Histogram(limits); test_1cfa_call_graph(vn, src, ie.getMethod(), call_edges); evalRes.total_call_edges.merge(call_edges); call_edges = null; } evalRes.n_geom_user_edges += edge_cnt; evalRes.n_user_callsites++; } } ptsProvider.ps.println(); ptsProvider.ps.println("--------> Virtual Callsites Evaluation <---------"); ptsProvider.ps.printf("Total virtual callsites (app code): %d (%d)\n", evalRes.n_callsites, evalRes.n_user_callsites); ptsProvider.ps.printf("Total virtual call edges (app code): %d (%d)\n", evalRes.n_geom_call_edges, evalRes.n_geom_user_edges); ptsProvider.ps.printf("Virtual callsites additionally solved by geomPTA compared to SPARK (app code) = %d (%d)\n", evalRes.n_geom_solved_all, evalRes.n_geom_solved_app); evalRes.total_call_edges.printResult(ptsProvider.ps, "Testing of unsolved callsites on 1-CFA call graph: "); if (ptsProvider.getOpts().verbose()) ptsProvider.outputNotEvaluatedMethods(); }
Example #15
Source File: Scene.java From JAADAS with GNU General Public License v3.0 | 4 votes |
public void setCallGraph(CallGraph cg) { reachableMethods = null; activeCallGraph = cg; }
Example #16
Source File: BackwardsObservableICFG.java From SPDS with Eclipse Public License 2.0 | 4 votes |
@Override public CallGraph getCallGraphCopy() { return delegate.getCallGraphCopy(); }
Example #17
Source File: PropagationSceneTransformer.java From DroidRA with GNU Lesser General Public License v2.1 | 4 votes |
@Override protected void internalTransform(String phaseName, @SuppressWarnings("rawtypes") Map options) { PropagationTimers.v().totalTimer.start(); PropagationTimers.v().misc.start(); StringValueAnalysis.initialize(); JimpleBasedInterproceduralCFG iCfg = new PropagationIcfg(); AnalysisParameters.v().setIcfg(iCfg); PropagationProblem problem = new PropagationProblem(iCfg); for (SootMethod ep : Scene.v().getEntryPoints()) { if (ep.isConcrete()) { problem.getInitialSeeds().add(ep.getActiveBody().getUnits().getFirst()); } } int iterationCounter = 0; PropagationSolver solver = null; while (iterationCounter < MAX_ITERATIONS) { IterationSolver.v().initialize(solver); PropagationTimers.v().misc.end(); PropagationTimers.v().problemGeneration.start(); solver = new PropagationSolver(problem); PropagationTimers.v().problemGeneration.end(); PropagationTimers.v().ideSolution.start(); logger.info("Solving propagation problem (iteration " + iterationCounter + ")"); solver.solve(); PropagationTimers.v().ideSolution.end(); PropagationTimers.v().misc.start(); if (!AnalysisParameters.v().isIterative() || IterationSolver.v().hasFoundFixedPoint()) { iterationCounter = MAX_ITERATIONS; } else { ++iterationCounter; } } PropagationTimers.v().misc.end(); logger.info("Reached a fixed point"); Results.addResult(resultBuilder.buildResult(solver)); PropagationTimers.v().totalTimer.end(); if (logger.isDebugEnabled()) { CallGraph cg = Scene.v().getCallGraph(); Iterator<Edge> it = cg.listener(); while (it.hasNext()) { soot.jimple.toolkits.callgraph.Edge e = (soot.jimple.toolkits.callgraph.Edge) it.next(); logger.debug("" + e.src() + e.srcStmt() + " =" + e.kind() + "=> " + e.tgt()); } if (printer != null) { printer.print(solver); } } }
Example #18
Source File: DummyMainGenerator.java From DroidRA with GNU Lesser General Public License v2.1 | 4 votes |
public SootMethod appendNonComponents(SootMethod mainMethod) { Set<String> coveredMethods = new HashSet<String>(); CallGraph cg = Scene.v().getCallGraph(); for (Iterator<Edge> iter = cg.iterator(); iter.hasNext(); ) { Edge edge = iter.next(); coveredMethods.add(edge.src().getSignature()); coveredMethods.add(edge.tgt().getSignature()); } Chain<SootClass> sootClasses = Scene.v().getApplicationClasses(); for (Iterator<SootClass> iter = sootClasses.iterator(); iter.hasNext();) { SootClass sc = iter.next(); List<SootMethod> methodList = sc.getMethods(); for (SootMethod sm : methodList) { if (sm.getDeclaringClass().getName().startsWith("android.support")) { continue; } if (sc.isPhantom() || ! sm.isConcrete()) { continue; } if (sm.getName().equals("<init>") || sm.getName().equals("<clinit>")) { continue; } if (coveredMethods.contains(sm.getSignature())) { //Already covered. continue; } mainMethod = addMethod(mainMethod, sm.getSignature()); } } return mainMethod; }
Example #19
Source File: ObservableICFG.java From SPDS with Eclipse Public License 2.0 | votes |
CallGraph getCallGraphCopy();