[PATCH] D55862: [Sema] Don't try to account for the size of an incomplete type in CheckArrayAccess
Phabricator via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 20 12:08:46 PST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL349811: [Sema] Don't try to account for the size of an incomplete type in… (authored by brunoricci, committed by ).
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D55862?vs=179035&id=179117#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D55862/new/
https://reviews.llvm.org/D55862
Files:
cfe/trunk/lib/Sema/SemaChecking.cpp
cfe/trunk/test/SemaCXX/array-bounds.cpp
Index: cfe/trunk/test/SemaCXX/array-bounds.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/array-bounds.cpp
+++ cfe/trunk/test/SemaCXX/array-bounds.cpp
@@ -284,3 +284,12 @@
int test_struct_multiarray() {
return multi2[4].arr[0]; // expected-warning {{array index 4 is past the end of the array (which contains 4 elements)}}
}
+
+namespace PR39746 {
+ struct S;
+ extern S xxx[2];
+ class C {};
+
+ C &f() { return reinterpret_cast<C *>(xxx)[1]; } // no-warning
+ C &g() { return reinterpret_cast<C *>(xxx)[2]; } // no-warning
+}
Index: cfe/trunk/lib/Sema/SemaChecking.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp
+++ cfe/trunk/lib/Sema/SemaChecking.cpp
@@ -12379,10 +12379,19 @@
BaseExpr->getType()->getPointeeOrArrayElementType();
BaseExpr = BaseExpr->IgnoreParenCasts();
const ConstantArrayType *ArrayTy =
- Context.getAsConstantArrayType(BaseExpr->getType());
+ Context.getAsConstantArrayType(BaseExpr->getType());
+
if (!ArrayTy)
return;
+ const Type *BaseType = ArrayTy->getElementType().getTypePtr();
+ // It is possible that the type of the base expression after IgnoreParenCasts
+ // is incomplete, even though the type of the base expression before
+ // IgnoreParenCasts is complete (see PR39746 for an example). In this case we
+ // have no information about whether the array access is out-of-bounds.
+ if (BaseType->isIncompleteType())
+ return;
+
Expr::EvalResult Result;
if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects))
return;
@@ -12402,7 +12411,6 @@
if (!size.isStrictlyPositive())
return;
- const Type *BaseType = BaseExpr->getType()->getPointeeOrArrayElementType();
if (BaseType != EffectiveType) {
// Make sure we're comparing apples to apples when comparing index to size
uint64_t ptrarith_typesize = Context.getTypeSize(EffectiveType);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55862.179117.patch
Type: text/x-patch
Size: 1998 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181220/d5183aea/attachment.bin>
More information about the cfe-commits
mailing list