[clang] [clang][bytecode] Check for invalid record decls in IntPointer::atOffset (PR #169786)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 27 02:31:08 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
We can't access the RecordLayout of an invalid decl, so return failure if that happens.
Fixes https://github.com/llvm/llvm-project/issues/167076
---
Full diff: https://github.com/llvm/llvm-project/pull/169786.diff
3 Files Affected:
- (modified) clang/lib/AST/ByteCode/Interp.cpp (+6-2)
- (modified) clang/lib/AST/ByteCode/Pointer.cpp (+5-2)
- (modified) clang/lib/AST/ByteCode/Pointer.h (+2-1)
``````````diff
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index c3210d7119b40..80ef656dc6285 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1435,8 +1435,12 @@ static bool getField(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
return false;
if (Ptr.isIntegralPointer()) {
- S.Stk.push<Pointer>(Ptr.asIntPointer().atOffset(S.getASTContext(), Off));
- return true;
+ if (std::optional<IntPointer> IntPtr =
+ Ptr.asIntPointer().atOffset(S.getASTContext(), Off)) {
+ S.Stk.push<Pointer>(std::move(*IntPtr));
+ return true;
+ }
+ return false;
}
if (!Ptr.isBlockPointer()) {
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp
index 25719bd6f0f91..00e74db5655d6 100644
--- a/clang/lib/AST/ByteCode/Pointer.cpp
+++ b/clang/lib/AST/ByteCode/Pointer.cpp
@@ -895,8 +895,8 @@ std::optional<APValue> Pointer::toRValue(const Context &Ctx,
return Result;
}
-IntPointer IntPointer::atOffset(const ASTContext &ASTCtx,
- unsigned Offset) const {
+std::optional<IntPointer> IntPointer::atOffset(const ASTContext &ASTCtx,
+ unsigned Offset) const {
if (!this->Desc)
return *this;
const Record *R = this->Desc->ElemRecord;
@@ -914,6 +914,9 @@ IntPointer IntPointer::atOffset(const ASTContext &ASTCtx,
return *this;
const FieldDecl *FD = F->Decl;
+ if (FD->getParent()->isInvalidDecl())
+ return std::nullopt;
+
const ASTRecordLayout &Layout = ASTCtx.getASTRecordLayout(FD->getParent());
unsigned FieldIndex = FD->getFieldIndex();
uint64_t FieldOffset =
diff --git a/clang/lib/AST/ByteCode/Pointer.h b/clang/lib/AST/ByteCode/Pointer.h
index 57c8e45609027..0978090ba8b19 100644
--- a/clang/lib/AST/ByteCode/Pointer.h
+++ b/clang/lib/AST/ByteCode/Pointer.h
@@ -47,7 +47,8 @@ struct IntPointer {
const Descriptor *Desc;
uint64_t Value;
- IntPointer atOffset(const ASTContext &ASTCtx, unsigned Offset) const;
+ std::optional<IntPointer> atOffset(const ASTContext &ASTCtx,
+ unsigned Offset) const;
IntPointer baseCast(const ASTContext &ASTCtx, unsigned BaseOffset) const;
};
``````````
</details>
https://github.com/llvm/llvm-project/pull/169786
More information about the cfe-commits
mailing list