public static CGStats getCGStats(CallGraph cg) { if (cg == null) { throw new IllegalArgumentException("cg is null"); } Set<CGNode> reachableNodes = DFS.getReachableNodes(cg, Collections.singleton(cg.getFakeRootNode())); int nNodes = 0; int nEdges = 0; for (CGNode n : reachableNodes) { nNodes++; nEdges += cg.getSuccNodeCount(n); } return new CGStats(nNodes, nEdges, collectMethods(cg).size(), countBytecodeBytes(cg)); }
public static CGStats getCGStats(CallGraph cg) { if (cg == null) { throw new IllegalArgumentException("cg is null"); } Set<CGNode> reachableNodes = DFS.getReachableNodes(cg, Collections.singleton(cg.getFakeRootNode())); int nNodes = 0; int nEdges = 0; for (CGNode n : reachableNodes) { nNodes++; nEdges += cg.getSuccNodeCount(n); } return new CGStats(nNodes, nEdges, collectMethods(cg).size(), countBytecodeBytes(cg)); }
private static void checkCallAssertions(CallGraph cg, int desiredNumberOfTargets, int desiredNumberOfCalls, int numLocalCastCallees) { int numberOfCalls = 0; Set<CGNode> callerNodes = HashSetFactory.make(); callerNodes.addAll(cg.getNodes(thisBinaryRef)); callerNodes.addAll(cg.getNodes(thatBinaryRef)); assert callerNodes.size() == 2; for (CGNode n : callerNodes) { for (CallSiteReference csRef : Iterator2Iterable.make(n.iterateCallSites())) { if (csRef.getDeclaredTarget().equals(unary2Ref)) { numberOfCalls++; assert cg.getNumberOfTargets(n, csRef) == desiredNumberOfTargets; } } } assert numberOfCalls == desiredNumberOfCalls; CGNode localCastNode = cg.getNodes(MethodReference.findOrCreate(TypeReference.findOrCreate(loader, TestConstants.PI_TEST_MAIN), "localCast", "()V")).iterator().next(); int actualLocalCastCallees = cg.getSuccNodeCount(localCastNode); Assert.assertEquals(numLocalCastCallees, actualLocalCastCallees); }
@Test public void testFunctionDotCall() throws IOException, IllegalArgumentException, CancelException, WalaException { CallGraph cg = JSCallGraphBuilderUtil.makeScriptCG("tests", "function_call.js"); for (CGNode n : cg) { if (n.getMethod().getName().toString().equals("call4")) { Assert.assertEquals(2, cg.getSuccNodeCount(n)); // ugh List<CGNode> succs = Iterator2Collection.toList(cg.getSuccNodes(n)); Assert .assertEquals( "[Node: <Code body of function Lfunction_call.js/foo> Context: Everywhere, Node: <Code body of function Lfunction_call.js/bar> Context: Everywhere]", succs.toString()); } } }
/** * Test that when analyzing Reflect18, the call graph includes a node for * java.lang.Integer.toString() */ @Test public void testReflect18() throws WalaException, IllegalArgumentException, CancelException, IOException { AnalysisScope scope = findOrCreateAnalysisScope(); IClassHierarchy cha = findOrCreateCHA(scope); Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, TestConstants.REFLECT18_MAIN); AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints); CallGraph cg = CallGraphTestUtil.buildZeroOneCFA(options, new AnalysisCacheImpl(), cha, scope, false); TypeReference tr = TypeReference.findOrCreate(ClassLoaderReference.Application, "Lreflection/Helper"); MethodReference mr = MethodReference.findOrCreate(tr, "t", "(Ljava/lang/Integer;)V"); CGNode node = cg.getNode(cg.getClassHierarchy().resolveMethod(mr), Everywhere.EVERYWHERE); Assert.assertEquals(1, cg.getSuccNodeCount(node)); CGNode succ = cg.getSuccNodes(node).next(); Assert.assertEquals("Node: < Primordial, Ljava/lang/Integer, toString()Ljava/lang/String; > Context: Everywhere", succ.toString()); }
/** * Test that when analyzing Reflect17, the call graph does not include any * edges from reflection.Helper.t() */ @Test public void testReflect17() throws WalaException, IllegalArgumentException, CancelException, IOException { AnalysisScope scope = findOrCreateAnalysisScope(); IClassHierarchy cha = findOrCreateCHA(scope); Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, TestConstants.REFLECT17_MAIN); AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints); CallGraph cg = CallGraphTestUtil.buildZeroOneCFA(options, new AnalysisCacheImpl(), cha, scope, false); TypeReference tr = TypeReference.findOrCreate(ClassLoaderReference.Application, "Lreflection/Helper"); MethodReference mr = MethodReference.findOrCreate(tr, "t", "(Ljava/lang/Integer;)V"); CGNode node = cg.getNode(cg.getClassHierarchy().resolveMethod(mr), Everywhere.EVERYWHERE); Assert.assertEquals(0, cg.getSuccNodeCount(node)); }