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

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).

Tested with the reproducer from the GitHub issue.

>From 8eb98a93cc912887c302def9b8259688df64cfdc Mon Sep 17 00:00:00 2001
From: Osama Abdelkader <[email protected]>
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).

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

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

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to