[clang] [clang][bytecode] Fix unknown size arrays crash in clang bytecode (PR #160015)

Osama Abdelkader via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 22 03:42:53 PDT 2025


https://github.com/osamakader updated https://github.com/llvm/llvm-project/pull/160015

>From 37f712ce9130e949a18ff8ebe5dc0924ea06df81 Mon Sep 17 00:00:00 2001
From: Osama Abdelkader <osama.abdelkader at gmail.com>
Date: Mon, 22 Sep 2025 00:59:48 +0300
Subject: [PATCH] [clang][bytecode] Fix unknown size arrays crash in clang
 bytecode

This fixes issue #153948 where clang crashes with assertion failure
'Array of unknown size' when evaluating strlen() on external const char[]
declarations.

The issue was in evaluateStrlen() which called getNumElems() on unknown
size arrays, leading to an assertion in Descriptor::getSize().

Fix: Add check for isUnknownSizeArray() before calling getNumElems() to
gracefully handle unknown size arrays by returning false (indicating
strlen cannot be evaluated at compile time).

Handle dummy blocks (external/unknown declarations) also is added.

Tested with the reproducer from the GitHub issue.
---
 clang/lib/AST/ByteCode/Context.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/clang/lib/AST/ByteCode/Context.cpp b/clang/lib/AST/ByteCode/Context.cpp
index cfda6e8ded760..df783f38f7f9a 100644
--- a/clang/lib/AST/ByteCode/Context.cpp
+++ b/clang/lib/AST/ByteCode/Context.cpp
@@ -245,6 +245,10 @@ bool Context::evaluateStrlen(State &Parent, const Expr *E, uint64_t &Result) {
     if (!FieldDesc->isPrimitiveArray())
       return false;
 
+    // Handle dummy blocks (external/unknown declarations) and unknown size arrays - we can't determine the length at compile time
+    if (Ptr.isDummy() || Ptr.isUnknownSizeArray())
+      return false;
+
     unsigned N = Ptr.getNumElems();
     if (Ptr.elemSize() == 1) {
       Result = strnlen(reinterpret_cast<const char *>(Ptr.getRawAddress()), N);



More information about the cfe-commits mailing list