]> granicus.if.org Git - clang/commitdiff
[analyzer] GNU __null is a pointer-sized integer, not a pointer. Fixes PR10372.
authorJordy Rose <jediknil@belkadan.com>
Fri, 15 Jul 2011 20:29:02 +0000 (20:29 +0000)
committerJordy Rose <jediknil@belkadan.com>
Fri, 15 Jul 2011 20:29:02 +0000 (20:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135294 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/ExprEngine.cpp
test/Analysis/nullptr.cpp

index cdf76bfa3ef22009104fef6551855cf403788a0f..ffe5f0b6cdf2b0b9c446a4d53f7c367177dd22e4 100644 (file)
@@ -510,7 +510,10 @@ void ExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
       break;
 
     case Stmt::GNUNullExprClass: {
-      MakeNode(Dst, S, Pred, GetState(Pred)->BindExpr(S, svalBuilder.makeNull()));
+      // GNU __null is a pointer-width integer, not an actual pointer.
+      const GRState *state = GetState(Pred);
+      state = state->BindExpr(S, svalBuilder.makeIntValWithPtrWidth(0, false));
+      MakeNode(Dst, S, Pred, state);
       break;
     }
 
index b74a5abcdfa4b4942fab89d0dddfcf7345af1b89..6f78baebfe22a48d7d646ea62412f78c5c207424 100644 (file)
@@ -39,3 +39,11 @@ void foo4(void) {
     *np = 0;  // no-warning
 }
 
+
+int pr10372(void *& x) {
+  // GNU null is a pointer-sized integer, not a pointer.
+  x = __null;
+  // This used to crash.
+  return __null;
+}
+