[compiler-rt] [rtsan] Add test for pthread_cond_wait segfault (PR #150776)
Chris Apple via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 26 09:32:33 PDT 2025
https://github.com/cjappl created https://github.com/llvm/llvm-project/pull/150776
Introduce the test from https://github.com/llvm/llvm-project/issues/146120
For future readers of this PR, if this test causes a segfault please comment out the line indicated by the comment (or revert this entire commit).
My plan is to commit this, see if any test runners fail, then submit the fix in a follow on.
I cannot repro this bug on my machine so I need some confirmation of the bug being fixed as it is submitted.
>From 3f1e8028d51fdc9d0bf60323c99a09431f8dd408 Mon Sep 17 00:00:00 2001
From: Chris Apple <cja-private at pm.me>
Date: Sat, 26 Jul 2025 09:29:40 -0700
Subject: [PATCH] [rtsan] Add test for pthread_cond_wait segfault
---
compiler-rt/test/rtsan/pthread_cond_wait.cpp | 46 ++++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 compiler-rt/test/rtsan/pthread_cond_wait.cpp
diff --git a/compiler-rt/test/rtsan/pthread_cond_wait.cpp b/compiler-rt/test/rtsan/pthread_cond_wait.cpp
new file mode 100644
index 0000000000000..915ec07228554
--- /dev/null
+++ b/compiler-rt/test/rtsan/pthread_cond_wait.cpp
@@ -0,0 +1,46 @@
+// RUN: %clangxx -fsanitize=realtime %s -o %t
+// RUN: %run %t 2>&1 | FileCheck %s
+
+// UNSUPPORTED: ios
+
+// Intent: Ensures that pthread_cond_signal does not segfault under rtsan
+// See issue #146120
+
+#include <condition_variable>
+#include <future>
+#include <mutex>
+#include <thread>
+
+#include <iostream>
+
+int main() {
+ std::cout << "Entry to main!" << std::endl;
+ std::mutex mut;
+ std::condition_variable cv;
+ bool go{false};
+
+ const auto fut = std::async(std::launch::async, [&] {
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ {
+ std::unique_lock<std::mutex> lock(mut);
+ go = true;
+ }
+ cv.notify_one();
+ });
+
+ std::unique_lock<std::mutex> lock(mut);
+ // normal wait is fine
+ // cv.wait(lock, [&] { return go; });
+ // but timed wait could segfault
+
+ // NOTE: If this test segfaults on a test runner, please comment
+ // out this line and submit the patch.
+ // I will follow up with a fix of the underlying problem,
+ // but first I need to understand if it fails a test runner
+ cv.wait_for(lock, std::chrono::milliseconds(200), [&] { return go; });
+
+ std::cout << "Exit from main!" << std::endl;
+}
+
+// CHECK: Entry to main!
+// CHECK-NEXT: Exit from main!
More information about the llvm-commits
mailing list