https://github.com/osamakader updated https://github.com/llvm/llvm-project/pull/160015
>From b8dc9feae1a16c3a4276dfafca121232e5c154ac Mon Sep 17 00:00:00 2001 From: Osama Abdelkader <osama.abdelka...@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 isDummy() || 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 and added test case. --- clang/lib/AST/ByteCode/Context.cpp | 4 ++++ .../AST/ByteCode/strlen-unknown-size-array.cpp | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 clang/test/AST/ByteCode/strlen-unknown-size-array.cpp 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); diff --git a/clang/test/AST/ByteCode/strlen-unknown-size-array.cpp b/clang/test/AST/ByteCode/strlen-unknown-size-array.cpp new file mode 100644 index 0000000000000..a162ae47e0593 --- /dev/null +++ b/clang/test/AST/ByteCode/strlen-unknown-size-array.cpp @@ -0,0 +1,14 @@ +// Test that strlen() on external/unknown declarations doesn't crash the bytecode interpreter +// This fixes issue #153948 + +#include <cstddef> +#include <cstdlib> +#include <cstring> + +extern const char s[]; + +void foo(char *x) +{ + char *r = static_cast<char*>(std::malloc(std::strlen(x))); + std::strcpy(r, s); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits