diff options
author | Igor Kudrin <ikudrin@accesssoftek.com> | 2025-08-13 14:15:45 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-13 14:15:45 -0700 |
commit | 36c2a6696853020ffc0072566b1f5e77efe96d0c (patch) | |
tree | b4cd62cc1d6bf0ca415a39000eb5f6260a499a73 | |
parent | 8061cae756aecf0da689ba31e0e14bf2b37b5e7f (diff) | |
download | llvm-36c2a6696853020ffc0072566b1f5e77efe96d0c.zip llvm-36c2a6696853020ffc0072566b1f5e77efe96d0c.tar.gz llvm-36c2a6696853020ffc0072566b1f5e77efe96d0c.tar.bz2 |
[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
-rw-r--r-- | lldb/test/API/python_api/find_in_memory/address_ranges_helper.py | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/lldb/test/API/python_api/find_in_memory/address_ranges_helper.py b/lldb/test/API/python_api/find_in_memory/address_ranges_helper.py index dcceca6..102f2b0 100644 --- a/lldb/test/API/python_api/find_in_memory/address_ranges_helper.py +++ b/lldb/test/API/python_api/find_in_memory/address_ranges_helper.py @@ -55,27 +55,34 @@ def GetRangeFromAddrValue(test_base, addr, shrink=False): return lldb.SBAddressRange(start, size) -def IsWithinRange(addr, size, range, target): - start_addr = range.GetBaseAddress().GetLoadAddress(target) - end_addr = start_addr + range.GetByteSize() - addr = addr.GetValueAsUnsigned() - return addr >= start_addr and addr + size <= end_addr - - def GetHeapRanges(test_base, shrink=False): frame = test_base.thread.GetSelectedFrame() ex = frame.EvaluateExpression("heap_pointer1") test_base.assertTrue(ex.IsValid()) - range = GetRangeFromAddrValue(test_base, ex, shrink) - addr_ranges = lldb.SBAddressRangeList() - addr_ranges.Append(range) + range1 = GetRangeFromAddrValue(test_base, ex, shrink) + range1_start = range1.GetBaseAddress().GetLoadAddress(test_base.target) + range1_end = range1_start + range1.GetByteSize() ex = frame.EvaluateExpression("heap_pointer2") test_base.assertTrue(ex.IsValid()) - size = len(DOUBLE_INSTANCE_PATTERN_HEAP) - if not IsWithinRange(ex, size, addr_ranges[0], test_base.target): - addr_ranges.Append(GetRangeFromAddrValue(test_base, ex, shrink)) + range2 = GetRangeFromAddrValue(test_base, ex, shrink) + range2_start = range2.GetBaseAddress().GetLoadAddress(test_base.target) + range2_end = range2_start + range2.GetByteSize() + + addr_ranges = lldb.SBAddressRangeList() + + if range1_end < range2_start or range2_end < range1_start: + # The ranges do not overlap; add them both. + addr_ranges.Append(range1) + addr_ranges.Append(range2) + else: + # Merge overlapping ranges. + base = min(range1_start, range2_start) + end = max(range1_end, range2_end) + start = lldb.SBAddress(base, test_base.target) + size = end - base + addr_ranges.Append(lldb.SBAddressRange(start, size)) return addr_ranges |