[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