[clang] d94a828 - [clang][bytecode] Don't crash on a null Descriptor (#160506)

via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 24 05:48:42 PDT 2025


Author: Timm Baeder
Date: 2025-09-24T14:48:38+02:00
New Revision: d94a8282fbc60bcbb94732f06c98b93a7b09a35f

URL: https://github.com/llvm/llvm-project/commit/d94a8282fbc60bcbb94732f06c98b93a7b09a35f
DIFF: https://github.com/llvm/llvm-project/commit/d94a8282fbc60bcbb94732f06c98b93a7b09a35f.diff

LOG: [clang][bytecode] Don't crash on a null Descriptor (#160506)

... for dynamic memory allocation. This happens when the requested array
size is too large.

Fixes #152951

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Interp.h
    clang/test/AST/ByteCode/new-delete.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 3bc1a67feeba2..72288ed97db21 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -3534,6 +3534,9 @@ inline bool AllocCN(InterpState &S, CodePtr OpPC, const Descriptor *ElementDesc,
   if (!CheckDynamicMemoryAllocation(S, OpPC))
     return false;
 
+  if (!ElementDesc)
+    return false;
+
   SizeT NumElements = S.Stk.pop<SizeT>();
   if (!CheckArraySize(S, OpPC, &NumElements, ElementDesc->getSize(),
                       IsNoThrow)) {

diff  --git a/clang/test/AST/ByteCode/new-delete.cpp b/clang/test/AST/ByteCode/new-delete.cpp
index af747d7a15b12..f54854070573c 100644
--- a/clang/test/AST/ByteCode/new-delete.cpp
+++ b/clang/test/AST/ByteCode/new-delete.cpp
@@ -1091,6 +1091,19 @@ namespace NewNegSizeNothrow {
   static_assert(test_nothrow_neg_size(), "expected nullptr");
 } // namespace NewNegSizeNothrow
 
+#if __SIZEOF_SIZE_T == 8
+/// We can't allocate the array here as it is too big.
+/// Make sure we're not crashing by assuming an non-null
+/// Descriptor.
+namespace HugeAllocation {
+  void *p;
+  void foo ()
+  {
+    p = new char [256][256][256][256][256];
+  }
+}
+#endif
+
 #else
 /// Make sure we reject this prior to C++20
 constexpr int a() { // both-error {{never produces a constant expression}}


        


More information about the cfe-commits mailing list