[compiler-rt] [TSan] Fix p == end == ShadowMem::end in ShadowSet (PR #144994)
Kunqiu Chen via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 21 00:26:42 PDT 2025
https://github.com/Camsyn updated https://github.com/llvm/llvm-project/pull/144994
>From 515b0001a1376f96f556cf573c1066b526828b55 Mon Sep 17 00:00:00 2001
From: Camsyn <camsyn at foxmail.com>
Date: Fri, 20 Jun 2025 15:47:18 +0800
Subject: [PATCH 1/2] {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<RawShadow*>(RoundUp(
reinterpret_cast<uptr>(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 <camsyn at foxmail.com>
Date: Sat, 21 Jun 2025 15:26:28 +0800
Subject: [PATCH 2/2] 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<uptr>(p) % kAlign, 0);
DCHECK_EQ(reinterpret_cast<uptr>(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) {
More information about the llvm-commits
mailing list