https://github.com/igorkudrin created https://github.com/llvm/llvm-project/pull/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 >From 702a94ab73477e599c2c54b5f8c84ee680455dac Mon Sep 17 00:00:00 2001 From: Igor Kudrin <ikud...@accesssoftek.com> Date: Fri, 8 Aug 2025 16:27:31 -0700 Subject: [PATCH] [lldb][test] Make TestFindRangesInMemory.py more robust `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. --- .../find_in_memory/address_ranges_helper.py | 33 +++++++++++-------- 1 file 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 dcceca6d8a5c5..102f2b0edd4c6 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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits