]> granicus.if.org Git - clang/commitdiff
[analyzer] Teach the static analyzer about CXXForRangeStmt. Patch by Jim Goodnow II!
authorTed Kremenek <kremenek@apple.com>
Mon, 10 Oct 2011 22:36:31 +0000 (22:36 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 10 Oct 2011 22:36:31 +0000 (22:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141587 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/CoreEngine.cpp
lib/StaticAnalyzer/Core/ExprEngine.cpp
test/Analysis/misc-ps-cxx0x.cpp

index c675f608b5c35f41f9cdc37c9db72ff963191cc7..0587977f2c8ccb255383fe1c654beac8ecbb2573 100644 (file)
@@ -17,6 +17,7 @@
 #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
 #include "clang/Index/TranslationUnit.h"
 #include "clang/AST/Expr.h"
+#include "clang/AST/StmtCXX.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/ADT/DenseMap.h"
 using namespace clang;
@@ -349,6 +350,10 @@ void CoreEngine::HandleBlockExit(const CFGBlock * B, ExplodedNode *Pred) {
         HandleBranch(cast<DoStmt>(Term)->getCond(), Term, B, Pred);
         return;
 
+      case Stmt::CXXForRangeStmtClass:
+        HandleBranch(cast<CXXForRangeStmt>(Term)->getCond(), Term, B, Pred);
+        return;
+
       case Stmt::ForStmtClass:
         HandleBranch(cast<ForStmt>(Term)->getCond(), Term, B, Pred);
         return;
index 11719c370e0f2fbbb7220e555eba19b848036f53..11be71a96851b60253548374ab5ebaa15764d4de 100644 (file)
@@ -453,7 +453,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
     case Stmt::CXXBindTemporaryExprClass:
     case Stmt::CXXCatchStmtClass:
     case Stmt::CXXDependentScopeMemberExprClass:
-    case Stmt::CXXForRangeStmtClass:
     case Stmt::CXXPseudoDestructorExprClass:
     case Stmt::CXXThrowExprClass:
     case Stmt::CXXTryStmtClass:
@@ -500,6 +499,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
     case Stmt::CaseStmtClass:
     case Stmt::CompoundStmtClass:
     case Stmt::ContinueStmtClass:
+    case Stmt::CXXForRangeStmtClass:
     case Stmt::DefaultStmtClass:
     case Stmt::DoStmtClass:
     case Stmt::ForStmtClass:
index e840bb01d2a86b93c86bc6432b50eeb020f6e268..b00164ca4769d99817dc83f54e1bd942f2a2228d 100644 (file)
@@ -45,3 +45,26 @@ int tempobj2()
 
   return j; // no-warning
 }
+
+
+// Test for correct handling of C++ ForRange statement.
+void test1() {
+  int array[2] = { 1, 2 };
+  int j = 0;
+  for ( int i : array )
+    j += i;
+  int *p = 0;
+  *p = 0xDEADBEEF;  // expected-warning {{null}}
+}
+
+void test2() {
+  int array[2] = { 1, 2 };
+  int j = 0;
+  for (int i : array)
+    j += i;
+  if (j == 3)
+    return;
+  int *p = 0;
+  *p = 0xDEADBEEF;  // no-warning
+}
+