Skip to content

Commit 36c2a66

Browse files
authored
[lldb][test] Make TestFindRangesInMemory.py more robust (#152817)
`GetHeapRanges()` could return two overlapping ranges because it did not check whether `heap_pointer1` lies within the range returned for `heap_pointer2`. This could result in a test failure in `test_find_ranges_in_memory_two_matches` when `process.FindRangesInMemory()` returned 3 instead of 2. The patch ensures that `GetHeapRanges()` returns either two non-overlapping ranges or one range covering both heap pointers. The issue was probably introduced in #111951
1 parent 8061cae commit 36c2a66

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

lldb/test/API/python_api/find_in_memory/address_ranges_helper.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,27 +55,34 @@ def GetRangeFromAddrValue(test_base, addr, shrink=False):
5555
return lldb.SBAddressRange(start, size)
5656

5757

58-
def IsWithinRange(addr, size, range, target):
59-
start_addr = range.GetBaseAddress().GetLoadAddress(target)
60-
end_addr = start_addr + range.GetByteSize()
61-
addr = addr.GetValueAsUnsigned()
62-
return addr >= start_addr and addr + size <= end_addr
63-
64-
6558
def GetHeapRanges(test_base, shrink=False):
6659
frame = test_base.thread.GetSelectedFrame()
6760

6861
ex = frame.EvaluateExpression("heap_pointer1")
6962
test_base.assertTrue(ex.IsValid())
70-
range = GetRangeFromAddrValue(test_base, ex, shrink)
71-
addr_ranges = lldb.SBAddressRangeList()
72-
addr_ranges.Append(range)
63+
range1 = GetRangeFromAddrValue(test_base, ex, shrink)
64+
range1_start = range1.GetBaseAddress().GetLoadAddress(test_base.target)
65+
range1_end = range1_start + range1.GetByteSize()
7366

7467
ex = frame.EvaluateExpression("heap_pointer2")
7568
test_base.assertTrue(ex.IsValid())
76-
size = len(DOUBLE_INSTANCE_PATTERN_HEAP)
77-
if not IsWithinRange(ex, size, addr_ranges[0], test_base.target):
78-
addr_ranges.Append(GetRangeFromAddrValue(test_base, ex, shrink))
69+
range2 = GetRangeFromAddrValue(test_base, ex, shrink)
70+
range2_start = range2.GetBaseAddress().GetLoadAddress(test_base.target)
71+
range2_end = range2_start + range2.GetByteSize()
72+
73+
addr_ranges = lldb.SBAddressRangeList()
74+
75+
if range1_end < range2_start or range2_end < range1_start:
76+
# The ranges do not overlap; add them both.
77+
addr_ranges.Append(range1)
78+
addr_ranges.Append(range2)
79+
else:
80+
# Merge overlapping ranges.
81+
base = min(range1_start, range2_start)
82+
end = max(range1_end, range2_end)
83+
start = lldb.SBAddress(base, test_base.target)
84+
size = end - base
85+
addr_ranges.Append(lldb.SBAddressRange(start, size))
7986

8087
return addr_ranges
8188

0 commit comments

Comments
 (0)