[lldb] Refactor away UB in SBValue::GetLoadAddress (#141799)

The problem was in calling GetLoadAddress on a value in the error state,
where `ValueObject::GetLoadAddress` could end up accessing the
uninitialized "address type" by-ref return value from `GetAddressOf`.
This probably happened because each function expected the other to
initialize it.

We can guarantee initialization by turning this into a proper return
value.

I've added a test, but it only (reliably) crashes if lldb is built with
ubsan.
This commit is contained in:
Pavel Labath
2025-06-02 09:39:56 +02:00
committed by GitHub
parent 246d5da7fe
commit e9fad0e91c
26 changed files with 147 additions and 189 deletions

View File

@@ -269,7 +269,14 @@ class ValueAPITestCase(TestBase):
frame0.FindVariable("another_fixed_int_ptr").GetValue(),
"0xaa",
)
a_null_int_ptr = frame0.FindVariable("a_null_int_ptr")
self.assertEqual(a_null_int_ptr.GetValue(), "0x0")
# Check that dereferencing a null pointer produces reasonable results
# (does not crash).
self.assertEqual(
frame0.FindVariable("a_null_int_ptr").GetValue(),
"0x0",
a_null_int_ptr.Dereference().GetError().GetCString(), "parent is NULL"
)
self.assertEqual(
a_null_int_ptr.Dereference().GetLoadAddress(), lldb.LLDB_INVALID_ADDRESS
)