mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-16 05:01:56 +00:00
[lldb] Make the NSSet formatter faster and less prone to infinite recursion
Right now to get the 'NSSet *` pointer value we first derefence it and then take the address of the result. Beside being inefficient this potentially can cause an infinite recursion if the `pointer` value we get is a pointer of a type that the TypeSystem can't derefence. If the pointer is for example some form of `void *` that the dynamic type resolution can't resolve to an actual type, then the `Derefence` call goes back to asking the formatters how to reference it. If the NSSet formatter then checks if it's an NSSet variation under the hood then we just end infinitely often recursion. In practice this seems to happen with some form of Builtin.RawPointer we get from a NSDictionary in Swift. FWIW, no other formatter is doing the same deref->addressOf as here and there doesn't seem to be any specific reason to do so in the git history (it's just part of the initial formatter commit) Reviewed By: JDevlieghere Differential Revision: https://reviews.llvm.org/D101537
This commit is contained in:
parent
5fbea82692
commit
a76df78470
@ -444,18 +444,12 @@ bool lldb_private::formatters::NSSetISyntheticFrontEnd::Update() {
|
||||
if (!valobj_sp)
|
||||
return false;
|
||||
m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
|
||||
Status error;
|
||||
if (valobj_sp->IsPointerType()) {
|
||||
valobj_sp = valobj_sp->Dereference(error);
|
||||
if (error.Fail() || !valobj_sp)
|
||||
return false;
|
||||
}
|
||||
error.Clear();
|
||||
lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
|
||||
if (!process_sp)
|
||||
return false;
|
||||
m_ptr_size = process_sp->GetAddressByteSize();
|
||||
uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
|
||||
uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
|
||||
Status error;
|
||||
if (m_ptr_size == 4) {
|
||||
m_data_32 = new DataDescriptor_32();
|
||||
process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32),
|
||||
@ -728,18 +722,12 @@ lldb_private::formatters::
|
||||
if (!valobj_sp)
|
||||
return false;
|
||||
m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
|
||||
Status error;
|
||||
if (valobj_sp->IsPointerType()) {
|
||||
valobj_sp = valobj_sp->Dereference(error);
|
||||
if (error.Fail() || !valobj_sp)
|
||||
return false;
|
||||
}
|
||||
error.Clear();
|
||||
lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
|
||||
if (!process_sp)
|
||||
return false;
|
||||
m_ptr_size = process_sp->GetAddressByteSize();
|
||||
uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
|
||||
uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
|
||||
Status error;
|
||||
if (m_ptr_size == 4) {
|
||||
m_data_32 = new D32();
|
||||
process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
|
||||
|
Loading…
x
Reference in New Issue
Block a user