r349811 - [Sema] Don't try to account for the size of an incomplete type in CheckArrayAccess
Bruno Ricci via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 20 12:05:12 PST 2018
Author: brunoricci
Date: Thu Dec 20 12:05:11 2018
New Revision: 349811
URL: http://llvm.org/viewvc/llvm-project?rev=349811&view=rev
Log:
[Sema] Don't try to account for the size of an incomplete type in CheckArrayAccess
When checking that the array access is not out-of-bounds in CheckArrayAccess
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. In this case we have no information about whether the array access
is out-of-bounds and we should just bail-out instead. This fixes PR39746 which
was caused by trying to obtain the size of an incomplete type.
Differential Revision: https://reviews.llvm.org/D55862
Reviewed By: efriedma
Modified:
cfe/trunk/lib/Sema/SemaChecking.cpp
cfe/trunk/test/SemaCXX/array-bounds.cpp
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=349811&r1=349810&r2=349811&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Dec 20 12:05:11 2018
@@ -12379,10 +12379,19 @@ void Sema::CheckArrayAccess(const Expr *
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 @@ void Sema::CheckArrayAccess(const Expr *
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);
Modified: cfe/trunk/test/SemaCXX/array-bounds.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/array-bounds.cpp?rev=349811&r1=349810&r2=349811&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/array-bounds.cpp (original)
+++ cfe/trunk/test/SemaCXX/array-bounds.cpp Thu Dec 20 12:05:11 2018
@@ -284,3 +284,12 @@ struct multi_s multi2[4]; // expected-no
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
+}
More information about the cfe-commits
mailing list