https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/154777
>From f0365feffd401d92c4b1d12af3377afe5a1af41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Thu, 21 Aug 2025 16:54:58 +0200 Subject: [PATCH] [clang][bytecode] Guard strcmp against differing element types This can happen when casts are involved. Fixes #154006 --- clang/lib/AST/ByteCode/InterpBuiltin.cpp | 7 ++++++- clang/test/AST/ByteCode/c.c | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 2cbebaf7b630e..e3d1622f43d3f 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -205,6 +205,8 @@ static bool interp__builtin_strcmp(InterpState &S, CodePtr OpPC, if (A.isDummy() || B.isDummy()) return false; + if (!A.isBlockPointer() || !B.isBlockPointer()) + return false; bool IsWide = ID == Builtin::BIwcscmp || ID == Builtin::BIwcsncmp || ID == Builtin::BI__builtin_wcscmp || @@ -212,7 +214,10 @@ static bool interp__builtin_strcmp(InterpState &S, CodePtr OpPC, assert(A.getFieldDesc()->isPrimitiveArray()); assert(B.getFieldDesc()->isPrimitiveArray()); - assert(getElemType(A).getTypePtr() == getElemType(B).getTypePtr()); + // Different element types shouldn't happen, but with casts they can. + if (!S.getASTContext().hasSameUnqualifiedType(getElemType(A), getElemType(B))) + return false; + PrimType ElemT = *S.getContext().classify(getElemType(A)); auto returnResult = [&](int V) -> bool { diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c index 654b3da2b7d66..73469d7fd6cc4 100644 --- a/clang/test/AST/ByteCode/c.c +++ b/clang/test/AST/ByteCode/c.c @@ -338,3 +338,12 @@ static void *FooTable[1] = { } }; +int strcmp(const char *, const char *); // all-note {{passing argument to parameter here}} +#define S "\x01\x02\x03\x04\x05\x06\x07\x08" +const char _str[] = {S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7]}; +const unsigned char _str2[] = {S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7]}; +const int compared = strcmp(_str, (const char *)_str2); // all-error {{initializer element is not a compile-time constant}} + + +const int compared2 = strcmp(strcmp, _str); // all-warning {{incompatible pointer types}} \ + // all-error {{initializer element is not a compile-time constant}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits