]> granicus.if.org Git - clang/commitdiff
Improve BugReport diagnostics for loops and ? operator.
authorTed Kremenek <kremenek@apple.com>
Mon, 7 Apr 2008 23:35:17 +0000 (23:35 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 7 Apr 2008 23:35:17 +0000 (23:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49356 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BugReporter.cpp

index 8eb200017f2b25cec03379caffd6ccfe0003d99d..14f98fa1f4af90cc3521f0461af712a9eb3b0a96 100644 (file)
@@ -41,6 +41,11 @@ static inline Stmt* GetStmt(const ProgramPoint& P) {
   return NULL;
 }
 
+static inline Stmt* GetStmt(const CFGBlock* B) {
+  assert (!B->empty());
+  return (*B)[0];
+}
+
 
 PathDiagnosticPiece*
 BugDescription::getEndPath(ASTContext& Ctx, ExplodedNode<ValueState> *N) const {
@@ -142,7 +147,7 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
           std::ostringstream os;
           
           os << "Control jumps to line "
-          << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
+             << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
           
           PD.push_front(new PathDiagnosticPiece(L, os.str()));
           break;
@@ -206,7 +211,7 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
               }
               
               os << ":'  at line " 
-              << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
+                << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
               
               break;
               
@@ -216,11 +221,59 @@ void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
           PD.push_front(new PathDiagnosticPiece(L, os.str()));
           break;
         }
+
+        case Stmt::ConditionalOperatorClass: {
+          
+          std::ostringstream os;
+          os << "'?' condition evaluates to ";
+
+          if (*(Src->succ_begin()+1) == Dst)
+            os << "false.";
+          else
+            os << "true.";
+          
+          PD.push_front(new PathDiagnosticPiece(L, os.str()));
+          
+          break;
+        }
           
+        case Stmt::DoStmtClass:  {
+          
+          if (*(Src->succ_begin()) == Dst) {
+            
+            std::ostringstream os;          
+            
+            os << "Loop condition is true. Execution continues on line "
+               << SMgr.getLogicalLineNumber(GetStmt(Dst)->getLocStart()) << '.';
+            
+            PD.push_front(new PathDiagnosticPiece(L, os.str()));
+          }
+          else
+            PD.push_front(new PathDiagnosticPiece(L,
+                              "Loop condition is false.  Exiting loop."));
+          
+          break;
+        }
           
-        case Stmt::DoStmtClass:
         case Stmt::WhileStmtClass:
-        case Stmt::ForStmtClass:
+        case Stmt::ForStmtClass: {
+          
+          if (*(Src->succ_begin()+1) == Dst) {
+            
+            std::ostringstream os;          
+
+            os << "Loop condition is false. Execution continues on line "
+               << SMgr.getLogicalLineNumber(GetStmt(Dst)->getLocStart()) << '.';
+          
+            PD.push_front(new PathDiagnosticPiece(L, os.str()));
+          }
+          else
+            PD.push_front(new PathDiagnosticPiece(L,
+                            "Loop condition is true.  Entering loop body."));
+          
+          break;
+        }
+          
         case Stmt::IfStmtClass: {
           
           if (*(Src->succ_begin()+1) == Dst)