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); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
