From 515b0001a1376f96f556cf573c1066b526828b55 Mon Sep 17 00:00:00 2001 From: Camsyn Date: Fri, 20 Jun 2025 15:47:18 +0800 Subject: [PATCH 1/3] {TSan] Fix p == end == ShadowMem::end in ShadowSet When `p == end == ShadowMem::end`, it triggered a assertion fail previously. Now we do not allow `p == end` anymore in `ShadowSet`. --- compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp index dbdc6359d92aa..57434099e26ff 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp @@ -523,7 +523,7 @@ ALWAYS_INLINE USED void UnalignedMemoryAccess(ThreadState* thr, uptr pc, } 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)); UNUSED const uptr kAlign = kShadowCnt * kShadowSize; @@ -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,8 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) { Die(); } // Set the ending. - ShadowSet(mid2, end, val); + if (mid2 < end) + ShadowSet(mid2, end, val); } void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) { From b337187d32cd81441978a6e82fd34329a5692e54 Mon Sep 17 00:00:00 2001 From: Camsyn Date: Sat, 21 Jun 2025 15:26:28 +0800 Subject: [PATCH 2/3] fix some issues adhering to the reviewer --- compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp index 57434099e26ff..7b0966745659c 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp @@ -525,7 +525,7 @@ ALWAYS_INLINE USED void UnalignedMemoryAccess(ThreadState* thr, uptr pc, void ShadowSet(RawShadow* p, RawShadow* end, RawShadow v) { 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); @@ -578,8 +578,11 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) { Die(); } // Set the ending. - if (mid2 < end) + if (mid2 < end) { ShadowSet(mid2, end, val); + } else { + DCHECK_EQ(mid2, end); + } } void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) { From 30fdb5b7a91a71efc9959b8d901e961dd033221c Mon Sep 17 00:00:00 2001 From: Camsyn Date: Sat, 21 Jun 2025 21:29:06 +0800 Subject: [PATCH 3/3] Remove braces adhering to the coding standards --- compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp | 5 ++--- 1 file changed, 2 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 7b0966745659c..bd8deefefa1bc 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp @@ -578,11 +578,10 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) { Die(); } // Set the ending. - if (mid2 < end) { + if (mid2 < end) ShadowSet(mid2, end, val); - } else { + else DCHECK_EQ(mid2, end); - } } void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) {