[PATCH] D98798: Produce warning for performing pointer arithmetic on a null pointer.
Jamie Schmeiser via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu May 6 13:02:51 PDT 2021
jamieschmeiser updated this revision to Diff 343483.
jamieschmeiser added a comment.
Respond to review comments: add C++ test.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98798/new/
https://reviews.llvm.org/D98798
Files:
clang/lib/Sema/SemaExpr.cpp
clang/test/Sema/pointer-addition.c
clang/test/Sema/pointer-addition.cpp
Index: clang/test/Sema/pointer-addition.cpp
===================================================================
--- /dev/null
+++ clang/test/Sema/pointer-addition.cpp
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wextra -std=c++11
+
+void a() {
+ char *f = (char*)0;
+ f = (char*)((char*)0 - f); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
+ f = (char*)(f - (char*)0); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
+ f = (char*)((char*)0 - (char*)0); // valid in C++
+}
Index: clang/test/Sema/pointer-addition.c
===================================================================
--- clang/test/Sema/pointer-addition.c
+++ clang/test/Sema/pointer-addition.c
@@ -29,4 +29,7 @@
// Cases that don't match the GNU inttoptr idiom get a different warning.
f = (char*)0 - i; // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
int *g = (int*)0 + i; // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
+ f = (char*)((char*)0 - f); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
+ f = (char*)(f - (char*)0); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
+ f = (char*)((char*)0 - (char*)0); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}} expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}}
}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -10814,7 +10814,17 @@
LHS.get(), RHS.get()))
return QualType();
- // FIXME: Add warnings for nullptr - ptr.
+ bool LHSIsNullPtr = LHS.get()->IgnoreParenCasts()->isNullPointerConstant(
+ Context, Expr::NPC_ValueDependentIsNotNull);
+ bool RHSIsNullPtr = RHS.get()->IgnoreParenCasts()->isNullPointerConstant(
+ Context, Expr::NPC_ValueDependentIsNotNull);
+
+ // Subtracting nullptr or from nullptr should produce
+ // a warning expect nullptr - nullptr is valid in C++ [expr.add]p7
+ if (LHSIsNullPtr && (!getLangOpts().CPlusPlus || !RHSIsNullPtr))
+ diagnoseArithmeticOnNullPointer(*this, Loc, LHS.get(), false);
+ if (RHSIsNullPtr && (!getLangOpts().CPlusPlus || !LHSIsNullPtr))
+ diagnoseArithmeticOnNullPointer(*this, Loc, RHS.get(), false);
// The pointee type may have zero size. As an extension, a structure or
// union may have zero size or an array may have zero length. In this
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98798.343483.patch
Type: text/x-patch
Size: 2797 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210506/75ef4338/attachment.bin>
More information about the cfe-commits
mailing list