]> granicus.if.org Git - clang/commitdiff
[analyzer] Add inlining awareness to the block coverage computation
authorAnna Zaks <ganna@apple.com>
Thu, 22 Mar 2012 21:05:57 +0000 (21:05 +0000)
committerAnna Zaks <ganna@apple.com>
Thu, 22 Mar 2012 21:05:57 +0000 (21:05 +0000)
(Stats Checker).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153279 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp

index abc76b1ed7b47e78d5b1155028aa272543fc954a..6269acddb08a2afec7691aaad987640d751eea2b 100644 (file)
@@ -36,17 +36,21 @@ void AnalyzerStatsChecker::checkEndAnalysis(ExplodedGraph &G,
                                             ExprEngine &Eng) const {
   const CFG *C  = 0;
   const Decl *D = 0;
-  const LocationContext *LC = 0;
   const SourceManager &SM = B.getSourceManager();
   llvm::SmallPtrSet<const CFGBlock*, 256> reachable;
 
-  // Iterate over explodedgraph
+  // Root node should have the location context of the top most function.
+  const ExplodedNode *GraphRoot = *G.roots_begin();
+  const LocationContext *LC = GraphRoot->getLocation().getLocationContext();
+
+  // Iterate over the exploded graph.
   for (ExplodedGraph::node_iterator I = G.nodes_begin();
       I != G.nodes_end(); ++I) {
     const ProgramPoint &P = I->getLocation();
-    // Save the LocationContext if we don't have it already
-    if (!LC)
-      LC = P.getLocationContext();
+
+    // Only check the coverage in the top level function.
+    if (LC != P.getLocationContext())
+      continue;
 
     if (const BlockEntrance *BE = dyn_cast<BlockEntrance>(&P)) {
       const CFGBlock *CB = BE->getBlock();
@@ -72,6 +76,9 @@ void AnalyzerStatsChecker::checkEndAnalysis(ExplodedGraph &G,
 
   // We never 'reach' the entry block, so correct the unreachable count
   unreachable--;
+  // There is no BlockEntrance corresponding to the exit block as well, so
+  // assume it is reached as well.
+  unreachable--;
 
   // Generate the warning string
   SmallString<128> buf;