[clang] 3cd0bb7 - [clang][bytecode] Check evaluate{String, Strlen} for pointer type (#180524)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 9 07:02:59 PST 2026
Author: Timm Baeder
Date: 2026-02-09T16:02:53+01:00
New Revision: 3cd0bb7f67dca7307fc7b3956e9721da87ca32f6
URL: https://github.com/llvm/llvm-project/commit/3cd0bb7f67dca7307fc7b3956e9721da87ca32f6
DIFF: https://github.com/llvm/llvm-project/commit/3cd0bb7f67dca7307fc7b3956e9721da87ca32f6.diff
LOG: [clang][bytecode] Check evaluate{String,Strlen} for pointer type (#180524)
We can only use block pointers here.
Added:
Modified:
clang/lib/AST/ByteCode/Context.cpp
clang/test/AST/ByteCode/c.c
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Context.cpp b/clang/lib/AST/ByteCode/Context.cpp
index b4b8939f3fe00..879d51e6a2c3e 100644
--- a/clang/lib/AST/ByteCode/Context.cpp
+++ b/clang/lib/AST/ByteCode/Context.cpp
@@ -245,6 +245,9 @@ bool Context::evaluateString(State &Parent, const Expr *E,
Compiler<EvalEmitter> C(*this, *P, Parent, Stk);
auto PtrRes = C.interpretAsPointer(E, [&](const Pointer &Ptr) {
+ if (!Ptr.isBlockPointer())
+ return false;
+
const Descriptor *FieldDesc = Ptr.getFieldDesc();
if (!FieldDesc->isPrimitiveArray())
return false;
@@ -291,6 +294,9 @@ std::optional<uint64_t> Context::evaluateStrlen(State &Parent, const Expr *E) {
std::optional<uint64_t> Result;
auto PtrRes = C.interpretAsPointer(E, [&](const Pointer &Ptr) {
+ if (!Ptr.isBlockPointer())
+ return false;
+
const Descriptor *FieldDesc = Ptr.getFieldDesc();
if (!FieldDesc->isPrimitiveArray())
return false;
diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c
index 9496f8060884a..48a1b36259165 100644
--- a/clang/test/AST/ByteCode/c.c
+++ b/clang/test/AST/ByteCode/c.c
@@ -433,3 +433,9 @@ void intPtrCmp1(void) { &i + 1 == 2; } // all-warning {{comparison between point
// all-warning {{equality comparison result unused}}
void intPtrCmp2(void) { 2 == &i + 1; } // all-warning {{comparison between pointer and integer}} \
// all-warning {{equality comparison result unused}}
+
+/// evaluateStrlen on a non-block pointer.
+char *strcpy(char *restrict s1, const char *restrict s2);
+void strcpy_fn(char *x) {
+ strcpy(x, (char*)&strcpy_fn);
+}
More information about the cfe-commits
mailing list