]> granicus.if.org Git - clang/commitdiff
[analyzer] Look through __extension__ expressions in a GRState's Environment. Fixes...
authorJordy Rose <jediknil@belkadan.com>
Wed, 8 Jun 2011 22:47:39 +0000 (22:47 +0000)
committerJordy Rose <jediknil@belkadan.com>
Wed, 8 Jun 2011 22:47:39 +0000 (22:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132762 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/Environment.cpp
test/Analysis/misc-ps.c

index a00f9dc10b68520151d28271eaa536107d60ae00..e9f5016b36cdc0ef91df60bad9f6a914facfb196 100644 (file)
@@ -39,6 +39,9 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder,
   }
 
   for (;;) {
+    if (const Expr *Ex = dyn_cast<Expr>(E))
+      E = Ex->IgnoreParens();
+
     switch (E->getStmtClass()) {
       case Stmt::AddrLabelExprClass:
         return svalBuilder.makeLoc(cast<AddrLabelExpr>(E));
@@ -48,13 +51,10 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder,
         continue;        
       }        
       case Stmt::ParenExprClass:
-        // ParenExprs are no-ops.
-        E = cast<ParenExpr>(E)->getSubExpr();
-        continue;
       case Stmt::GenericSelectionExprClass:
-        // GenericSelectionExprs are no-ops.
-        E = cast<GenericSelectionExpr>(E)->getResultExpr();
-        continue;
+        llvm_unreachable("ParenExprs and GenericSelectionExprs should "
+                         "have been handled by IgnoreParens()");
+        return UnknownVal();
       case Stmt::CharacterLiteralClass: {
         const CharacterLiteral* C = cast<CharacterLiteral>(E);
         return svalBuilder.makeIntVal(C->getValue(), C->getType());
index 2d4fdd4637de17b22e89c8485cf23350c3e9539c..0729ce2f7750f02f83aff5fcfc2c69e025805d6a 100644 (file)
@@ -36,3 +36,17 @@ int rdar93730392() {
   return j;
 }
 
+
+int PR8962 (int *t) {
+  // This should look through the __extension__ no-op.
+  if (__extension__ (t)) return 0;
+  return *t; // expected-warning {{null pointer}}
+}
+
+int PR8962_b (int *t) {
+  // This should still ignore the nested casts
+  // which aren't handled by a single IgnoreParens()
+  if (((int)((int)t))) return 0;
+  return *t; // expected-warning {{null pointer}}
+}
+