[cfe-commits] r153532 - /cfe/trunk/lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp

Anna Zaks ganna at apple.com
Tue Mar 27 13:02:44 PDT 2012


Author: zaks
Date: Tue Mar 27 15:02:44 2012
New Revision: 153532

URL: http://llvm.org/viewvc/llvm-project?rev=153532&view=rev
Log:
[analyzer] Stats checker: minor interprocedural tweaks.

Report root function name with exhausted block diagnostic.

Also, use stack frames, not just any location context when checking if
the basic block is in the same context.

Modified:
    cfe/trunk/lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp

Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp?rev=153532&r1=153531&r2=153532&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/AnalyzerStatsChecker.cpp Tue Mar 27 15:02:44 2012
@@ -48,7 +48,8 @@
 
   // Root node should have the location context of the top most function.
   const ExplodedNode *GraphRoot = *G.roots_begin();
-  const LocationContext *LC = GraphRoot->getLocation().getLocationContext();
+  const LocationContext *LC =
+          GraphRoot->getLocation().getLocationContext()->getCurrentStackFrame();
 
   // Iterate over the exploded graph.
   for (ExplodedGraph::node_iterator I = G.nodes_begin();
@@ -56,7 +57,7 @@
     const ProgramPoint &P = I->getLocation();
 
     // Only check the coverage in the top level function.
-    if (LC != P.getLocationContext())
+    if (LC != P.getLocationContext()->getCurrentStackFrame())
       continue;
 
     if (const BlockEntrance *BE = dyn_cast<BlockEntrance>(&P)) {
@@ -91,20 +92,20 @@
   SmallString<128> buf;
   llvm::raw_svector_ostream output(buf);
   PresumedLoc Loc = SM.getPresumedLoc(D->getLocation());
-  if (Loc.isValid()) {
-    output << Loc.getFilename() << " : ";
+  if (!Loc.isValid())
+    return;
 
-    if (isa<FunctionDecl>(D) || isa<ObjCMethodDecl>(D)) {
-      const NamedDecl *ND = cast<NamedDecl>(D);
-      output << *ND;
-    }
-    else if (isa<BlockDecl>(D)) {
-      output << "block(line:" << Loc.getLine() << ":col:" << Loc.getColumn();
-    }
+  if (isa<FunctionDecl>(D) || isa<ObjCMethodDecl>(D)) {
+    const NamedDecl *ND = cast<NamedDecl>(D);
+    output << *ND;
+  }
+  else if (isa<BlockDecl>(D)) {
+    output << "block(line:" << Loc.getLine() << ":col:" << Loc.getColumn();
   }
   
   NumBlocksUnreachable += unreachable;
   NumBlocks += total;
+  std::string NameOfRootFunction = output.str();
 
   output << " -> Total CFGBlocks: " << total << " | Unreachable CFGBlocks: "
       << unreachable << " | Exhausted Block: "
@@ -115,7 +116,7 @@
   B.EmitBasicReport("Analyzer Statistics", "Internal Statistics", output.str(),
       PathDiagnosticLocation(D, SM));
 
-  // Emit warning for each block we bailed out on
+  // Emit warning for each block we bailed out on.
   typedef CoreEngine::BlocksExhausted::const_iterator ExhaustedIterator;
   const CoreEngine &CE = Eng.getCoreEngine();
   for (ExhaustedIterator I = CE.blocks_exhausted_begin(),
@@ -123,10 +124,14 @@
     const BlockEdge &BE =  I->first;
     const CFGBlock *Exit = BE.getDst();
     const CFGElement &CE = Exit->front();
-    if (const CFGStmt *CS = dyn_cast<CFGStmt>(&CE))
-      B.EmitBasicReport("Bailout Point", "Internal Statistics", "The analyzer "
-          "stopped analyzing at this point",
+    if (const CFGStmt *CS = dyn_cast<CFGStmt>(&CE)) {
+      SmallString<128> bufI;
+      llvm::raw_svector_ostream outputI(bufI);
+      outputI << "(" << NameOfRootFunction << ")" <<
+                 ": The analyzer generated a sink at this point";
+      B.EmitBasicReport("Sink Point", "Internal Statistics", outputI.str(),
           PathDiagnosticLocation::createBegin(CS->getStmt(), SM, LC));
+    }
   }
 }
 





More information about the cfe-commits mailing list