[clang] 4c367b4 - [clang][bytecode] Remove double pointer type checks in Load{,Pop} (#225802)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 23 22:20:55 PDT 2026
Author: Timm Baeder
Date: 2026-09-24T07:20:49+02:00
New Revision: 4c367b4ff3cf60fe5fb8e7eba02ed0b42b9e40ab
URL: https://github.com/llvm/llvm-project/commit/4c367b4ff3cf60fe5fb8e7eba02ed0b42b9e40ab
DIFF: https://github.com/llvm/llvm-project/commit/4c367b4ff3cf60fe5fb8e7eba02ed0b42b9e40ab.diff
LOG: [clang][bytecode] Remove double pointer type checks in Load{,Pop} (#225802)
Make sure that `CheckLoad` only returns true if the load is actually
valid.
Added:
Modified:
clang/lib/AST/ByteCode/Interp.cpp
clang/lib/AST/ByteCode/Interp.h
clang/lib/AST/ByteCode/InterpHelpers.h
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index b0c4c9b66c308..f885c0dc9cdb2 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1052,7 +1052,7 @@ bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
// Block and string pointers are the only ones we can actually read from.
if (!Ptr.isReadablePointerType())
- return CheckDummy(S, OpPC, Ptr, AK);
+ return diagnoseDummy(S, OpPC, Ptr, AK);
assert(Ptr.isStringPointer());
@@ -1070,7 +1070,7 @@ bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
bool CheckFinalLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
assert(!Ptr.isZero());
if (!Ptr.isReadablePointerType())
- return CheckDummy(S, OpPC, Ptr, AK_Read);
+ return diagnoseDummy(S, OpPC, Ptr, AK_Read);
if (Ptr.isBlockPointer() && !Ptr.block()->isAccessible()) {
if (!CheckLive(S, OpPC, Ptr, AK_Read))
@@ -1107,7 +1107,7 @@ bool CheckStore(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
return false;
if (Ptr.isOpaquePointer())
- return CheckDummy(S, OpPC, Ptr, AK);
+ return diagnoseDummy(S, OpPC, Ptr, AK);
if (!Ptr.isBlockPointer())
return false;
@@ -1428,11 +1428,8 @@ bool InvalidDeclRef(InterpState &S, CodePtr OpPC, const DeclRefExpr *DR,
return CheckDeclRef(S, OpPC, DR);
}
-bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
- AccessKinds AK) {
- if (!Ptr.isDummy())
- return true;
-
+bool diagnoseDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
+ AccessKinds AK) {
if (!S.diagnosing())
return false;
@@ -1448,6 +1445,13 @@ bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
return false;
}
+bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
+ AccessKinds AK) {
+ if (!Ptr.isDummy())
+ return true;
+ return diagnoseDummy(S, OpPC, Ptr, AK);
+}
+
static bool CheckNonNullArgs(InterpState &S, CodePtr OpPC, const Function *F,
const CallExpr *CE, unsigned ArgSize) {
auto Args = ArrayRef(CE->getArgs(), CE->getNumArgs());
@@ -2839,8 +2843,10 @@ bool CheckNewTypeMismatch(InterpState &S, CodePtr OpPC, const Expr *E,
return false;
}
+ if (Ptr.isDummy())
+ return diagnoseDummy(S, OpPC, Ptr, AK_Construct);
if (!Ptr.isBlockPointer())
- return CheckDummy(S, OpPC, Ptr, AK_Construct);
+ return false;
if (!CheckRange(S, OpPC, Ptr, AK_Construct))
return false;
@@ -2854,7 +2860,7 @@ bool CheckNewTypeMismatch(InterpState &S, CodePtr OpPC, const Expr *E,
return false;
if (!CheckLive(S, OpPC, Ptr, AK_Construct))
return false;
- return CheckDummy(S, OpPC, Ptr, AK_Construct);
+ return diagnoseDummy(S, OpPC, Ptr, AK_Construct);
}
if (!CheckTemporary(S, OpPC, Ptr, AK_Construct))
return false;
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index aec352bc08b32..14988eb9acb53 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -2220,8 +2220,6 @@ bool Load(InterpState &S, CodePtr OpPC) {
const Pointer &Ptr = S.Stk.peek<Pointer>();
if (!CheckLoad(S, OpPC, Ptr))
return false;
- if (!Ptr.isReadablePointerType())
- return false;
if (!Ptr.canDeref(Name))
return false;
S.Stk.push<T>(Ptr.load<T>());
@@ -2233,8 +2231,6 @@ bool LoadPop(InterpState &S, CodePtr OpPC) {
const Pointer &Ptr = S.Stk.pop<Pointer>();
if (!CheckLoad(S, OpPC, Ptr))
return false;
- if (!Ptr.isReadablePointerType())
- return false;
if (!Ptr.canDeref(Name))
return false;
S.Stk.push<T>(Ptr.load<T>());
diff --git a/clang/lib/AST/ByteCode/InterpHelpers.h b/clang/lib/AST/ByteCode/InterpHelpers.h
index 38a69b72e0c12..50f0462a93f16 100644
--- a/clang/lib/AST/ByteCode/InterpHelpers.h
+++ b/clang/lib/AST/ByteCode/InterpHelpers.h
@@ -42,6 +42,8 @@ bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
/// Checks if a pointer is a dummy pointer.
bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
AccessKinds AK);
+bool diagnoseDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
+ AccessKinds AK);
bool arrayElemPtrOpaque(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
APSInt &&Index, bool AllowReplace = true);
More information about the cfe-commits
mailing list