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

Ted Kremenek kremenek at apple.com
Fri Apr 22 09:58:17 PDT 2011


Looks great to me.  I'll apply.

On Apr 22, 2011, at 2:45 AM, Jim Goodnow II wrote:

> 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
> }
> 
> 
> <nullptr.cpp><NullPtr.patch>




More information about the cfe-commits mailing list