private void dfs(CFANode pNode) { NodeInfo infov = map.get(pNode); n = n + 1; infov.semi = n; vertex.set(n, pNode); infov.label = pNode; infov.ancestor = null; int m; if (mode == 0) { m = pNode.getNumLeavingEdges(); } else { m = pNode.getNumEnteringEdges(); } FunctionSummaryEdge e; CFANode w; if (mode == 0) { e = pNode.getLeavingSummaryEdge(); } else { e = pNode.getEnteringSummaryEdge(); } if (e != null) { if (mode == 0) { w = e.getSuccessor(); } else { w = e.getPredecessor(); } NodeInfo infow = map.get(w); if (infow.semi == 0) { infow.parent = pNode; dfs(w); } infow.pred.add(pNode); } // else{ for (int i = 0; i < m; i++) { if (mode == 0) { w = pNode.getLeavingEdge(i).getSuccessor(); } else { w = pNode.getEnteringEdge(i).getPredecessor(); } NodeInfo infow = map.get(w); if (infow.semi == 0) { infow.parent = pNode; dfs(w); } infow.pred.add(pNode); } // } }
public void writeCoverageReport( final PrintStream pStatisticsOutput, final ReachedSet pReached, final CFA pCfa) { if (!enabled) { return; } Multiset<FunctionEntryNode> reachedLocations = getFunctionEntriesFromReached(pReached); Map<String, FileCoverageInformation> infosPerFile = new HashMap<>(); // Add information about existing functions for (FunctionEntryNode entryNode : pCfa.getAllFunctionHeads()) { final FileLocation loc = entryNode.getFileLocation(); if (loc.getStartingLineNumber() == 0) { // dummy location continue; } final String functionName = entryNode.getFunctionName(); final FileCoverageInformation infos = getFileInfoTarget(loc, infosPerFile); final int startingLine = loc.getStartingLineInOrigin(); final int endingLine = loc.getEndingLineInOrigin(); infos.addExistingFunction(functionName, startingLine, endingLine); if (reachedLocations.contains(entryNode)) { infos.addVisitedFunction(entryNode.getFunctionName(), reachedLocations.count(entryNode)); } } // Add information about existing locations for (CFANode node : pCfa.getAllNodes()) { for (int i = 0; i < node.getNumLeavingEdges(); i++) { handleExistedEdge(node.getLeavingEdge(i), infosPerFile); } } Set<CFANode> reachedNodes = from(pReached).transform(EXTRACT_LOCATION).filter(notNull()).toSet(); // Add information about visited locations for (AbstractState state : pReached) { ARGState argState = AbstractStates.extractStateByType(state, ARGState.class); if (argState != null) { for (ARGState child : argState.getChildren()) { if (!child.isCovered()) { List<CFAEdge> edges = argState.getEdgesToChild(child); if (edges.size() > 1) { for (CFAEdge innerEdge : edges) { handleCoveredEdge(innerEdge, infosPerFile); } // BAM produces paths with no edge connection thus the list will be empty } else if (!edges.isEmpty()) { handleCoveredEdge(Iterables.getOnlyElement(edges), infosPerFile); } } } } else { // Simple kind of analysis // Cover all edges from reached nodes // It is less precise, but without ARG it is impossible to know what path we chose CFANode node = AbstractStates.extractLocation(state); for (int i = 0; i < node.getNumLeavingEdges(); i++) { CFAEdge edge = node.getLeavingEdge(i); if (reachedNodes.contains(edge.getSuccessor())) { handleCoveredEdge(edge, infosPerFile); } } } } for (CoverageWriter w : reportWriters) { w.write(infosPerFile, pStatisticsOutput); } }