[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