[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