From 99af99c6657db0ad76bc348fe075c873a10da031 Mon Sep 17 00:00:00 2001 From: Kunqiu Chen Date: Sat, 21 Jun 2025 23:02:41 +0800 Subject: [PATCH] [TSan] Fix p == end == ShadowMem::end in ShadowSet (#144994) In `ShadowSet`, when `p == end == ShadowMem::end`, it triggered an assertion fail previously. Now we do not allow `p == end` anymore in `ShadowSet`. --- compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp index dbdc6359d92a..bd8deefefa1b 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp @@ -523,9 +523,9 @@ SECOND: } void ShadowSet(RawShadow* p, RawShadow* end, RawShadow v) { - DCHECK_LE(p, end); + DCHECK_LT(p, end); DCHECK(IsShadowMem(p)); - DCHECK(p == end || IsShadowMem(end - 1)); + DCHECK(IsShadowMem(end - 1)); UNUSED const uptr kAlign = kShadowCnt * kShadowSize; DCHECK_EQ(reinterpret_cast(p) % kAlign, 0); DCHECK_EQ(reinterpret_cast(end) % kAlign, 0); @@ -569,6 +569,7 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) { RawShadow* mid1 = Min(end, reinterpret_cast(RoundUp( reinterpret_cast(begin) + kPageSize / 2, kPageSize))); + // begin must < mid1 ShadowSet(begin, mid1, val); // Reset middle part. RawShadow* mid2 = RoundDown(end, kPageSize); @@ -577,7 +578,10 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) { Die(); } // Set the ending. - ShadowSet(mid2, end, val); + if (mid2 < end) + ShadowSet(mid2, end, val); + else + DCHECK_EQ(mid2, end); } void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) {