[cfe-commits] [Patch][Review Request]nullptr take two

Jim Goodnow II Jim at TheGoodnows.net
Fri Apr 22 02:45:06 PDT 2011


Here's the revised patch and updated test.

  - jim

Index: lib/StaticAnalyzer/Core/ExprEngine.cpp
===================================================================
--- lib/StaticAnalyzer/Core/ExprEngine.cpp    (revision 129986)
+++ lib/StaticAnalyzer/Core/ExprEngine.cpp    (working copy)
@@ -424,7 +424,6 @@
      case Stmt::CXXCatchStmtClass:
      case Stmt::CXXDependentScopeMemberExprClass:
      case Stmt::CXXForRangeStmtClass:
-    case Stmt::CXXNullPtrLiteralExprClass:
      case Stmt::CXXPseudoDestructorExprClass:
      case Stmt::CXXTemporaryObjectExprClass:
      case Stmt::CXXThrowExprClass:
@@ -523,6 +522,7 @@
      case Stmt::ExprWithCleanupsClass:
      case Stmt::FloatingLiteralClass:
      case Stmt::SizeOfPackExprClass:
+    case Stmt::CXXNullPtrLiteralExprClass:
        Dst.Add(Pred); // No-op. Simply propagate the current state 
unchanged.
        break;

Index: lib/StaticAnalyzer/Core/Environment.cpp
===================================================================
--- lib/StaticAnalyzer/Core/Environment.cpp    (revision 129986)
+++ lib/StaticAnalyzer/Core/Environment.cpp    (working copy)
@@ -64,6 +64,9 @@
          else
            return svalBuilder.makeIntVal(cast<IntegerLiteral>(E));
        }
+      // For special C0xx nullptr case, make a null pointer SVal.
+      case Stmt::CXXNullPtrLiteralExprClass:
+        return svalBuilder.makeNull();
        case Stmt::ImplicitCastExprClass:
        case Stmt::CXXFunctionalCastExprClass:
        case Stmt::CStyleCastExprClass: {


=======================================
test/Analysis/nullptr.cpp
=======================================
// RUN: %clang_cc1 -std=c++0x -analyze -analyzer-checker=core 
-analyzer-store region -verify %s

// test to see if nullptr is detected as a null pointer
void foo1(void) {
   char  *np = nullptr;
   *np = 0;  // expected-warning{{Dereference of null pointer}}
}

// check if comparing nullptr to nullptr is detected properly
void foo2(void) {
   char *np1 = nullptr;
   char *np2 = np1;
   char c;
   if (np1 == np2)
     np1 = &c;
   *np1 = 0;  // no-warning
}

// invoving a nullptr in a more complex operation should be cause a warning
void foo3(void) {
   struct foo {
     int a, f;
   };
   char *np = nullptr;
   // casting a nullptr to anything should be caught eventually
   int *ip = &(((struct foo *)np)->f);
   *ip = 0;  // expected-warning{{Dereference of null pointer}}
   // should be error here too, but analysis gets stopped
//  *np = 0;
}

// nullptr is implemented as a zero integer value, so should be able to 
compare
void foo4(void) {
   char *np = nullptr;
   if (np != 0)
     *np = 0;  // no-warning
   char  *cp = 0;
   if (np != cp)
     *np = 0;  // no-warning
}


-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: nullptr.cpp
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110422/4d7d3970/attachment.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: NullPtr.patch
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110422/4d7d3970/attachment-0001.ksh>


More information about the cfe-commits mailing list