[clang] [clang][Sema] Avoid out-of-memory crash on huge designated initializer indices (PR #205503)
Mariya Podchishchaeva via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 13 02:07:17 PDT 2026
================
@@ -3375,6 +3375,24 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
DesignatedEndIndex.setIsUnsigned(true);
}
+ // The semantic form of an initializer list stores one pointer for every
+ // array element, including the elements omitted before a designator. Compute
+ // the required number of elements in a wider type so adding one cannot
+ // overflow.
+ llvm::APSInt NumInits = DesignatedEndIndex;
+ NumInits.setIsUnsigned(true);
+ NumInits = NumInits.extend(NumInits.getBitWidth() + 1);
+ ++NumInits;
+
+ if (NumInits.ugt(SemaRef.getLangOpts().MaxInitListElements)) {
+ if (!VerifyOnly) {
+ SemaRef.Diag(IndexExpr->getBeginLoc(), diag::err_array_too_large)
+ << toString(NumInits, 10) << IndexExpr->getSourceRange();
+ }
----------------
Fznamznon wrote:
Curleys are not required.
```suggestion
if (!VerifyOnly)
SemaRef.Diag(IndexExpr->getBeginLoc(), diag::err_array_too_large)
<< toString(NumInits, 10) << IndexExpr->getSourceRange();
```
https://github.com/llvm/llvm-project/pull/205503
More information about the cfe-commits
mailing list