[clang][bytecode] Fix a crash with typeid pointers (#154692)

That code is from a time when typeid pointers didn't exist. We can get
there for non-block, non-integral pointers, but we can't meaningfully
handle that case. Just return false.

Fixes #153712
This commit is contained in:
Timm Baeder 2025-08-21 13:13:02 +02:00 committed by GitHub
parent f306e0aeb2
commit c9bb3bdbca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 1 deletions

View File

@ -1806,6 +1806,8 @@ inline bool GetPtrBase(InterpState &S, CodePtr OpPC, uint32_t Off) {
return false;
if (!Ptr.isBlockPointer()) {
if (!Ptr.isIntegralPointer())
return false;
S.Stk.push<Pointer>(Ptr.asIntPointer().baseCast(S.getASTContext(), Off));
return true;
}
@ -1827,6 +1829,8 @@ inline bool GetPtrBasePop(InterpState &S, CodePtr OpPC, uint32_t Off,
return false;
if (!Ptr.isBlockPointer()) {
if (!Ptr.isIntegralPointer())
return false;
S.Stk.push<Pointer>(Ptr.asIntPointer().baseCast(S.getASTContext(), Off));
return true;
}

View File

@ -13,7 +13,12 @@ struct __type_info_implementations {
typedef __unique_impl __impl;
};
class type_info {
class __pointer_type_info {
public:
int __flags = 0;
};
class type_info : public __pointer_type_info {
protected:
typedef __type_info_implementations::__impl __impl;
__impl::__type_name_t __type_name;
@ -40,3 +45,10 @@ constexpr bool test() {
return true;
}
static_assert(test());
int dontcrash() {
auto& pti = static_cast<const std::__pointer_type_info&>(
typeid(int)
);
return pti.__flags == 0 ? 1 : 0;
}