From 9c98a9801dff79ea7e440f2a45f669be2cdc965b Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Wed, 16 Apr 2025 15:17:47 -0700 Subject: [PATCH] [NFC][Asan] CRLF to LF in a test --- .../asan/TestCases/asan_lsan_deadlock.cpp | 144 +++++++++--------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/compiler-rt/test/asan/TestCases/asan_lsan_deadlock.cpp b/compiler-rt/test/asan/TestCases/asan_lsan_deadlock.cpp index 4e1a2415ad01..28ce4e3e81b2 100644 --- a/compiler-rt/test/asan/TestCases/asan_lsan_deadlock.cpp +++ b/compiler-rt/test/asan/TestCases/asan_lsan_deadlock.cpp @@ -1,72 +1,72 @@ -// Test for potential deadlock in LeakSanitizer+AddressSanitizer. -// REQUIRES: leak-detection -// -// RUN: %clangxx_asan -O0 %s -o %t -// RUN: %env_asan_opts=detect_leaks=1 not %run %t 2>&1 | FileCheck %s - -/* - * Purpose: Verify deadlock prevention between ASan error reporting and LSan leak checking. - * - * Test Design: - * 1. Creates contention scenario between: - * - ASan's error reporting (requires lock B -> lock A ordering) - * - LSan's leak check (requires lock A -> lock B ordering) - * 2. Thread timing: - * - Main thread: Holds 'in' mutex -> Triggers LSan check (lock A then B) - * - Worker thread: Triggers ASan OOB error (lock B then A via symbolization) - * - * Deadlock Condition (if unfixed): - * Circular lock dependency forms when: - * [Main Thread] LSan: lock A -> requests lock B - * [Worker Thread] ASan: lock B -> requests lock A - * - * Success Criteria: - * With proper lock ordering enforcement, watchdog should NOT trigger - test exits normally. - * If deadlock occurs, watchdog terminates via _exit(1) after 10s timeout. - */ - -#include -#include -#include -#include -#include - -void Watchdog() { - // Safety mechanism: Turn infinite deadlock into finite test failure - usleep(10000000); - // CHECK-NOT: Timeout! Deadlock detected. - puts("Timeout! Deadlock detected."); - fflush(stdout); - _exit(1); -} - -int main(int argc, char **argv) { - int arr[1] = {0}; - std::mutex in; - in.lock(); - - std::thread w(Watchdog); - w.detach(); - - std::thread t([&]() { - in.unlock(); - /* - * Provoke ASan error: ASan's error reporting acquires: - * 1. ASan's thread registry lock (B) during the reporting - * 2. dl_iterate_phdr lock (A) during symbolization - */ - // CHECK: SUMMARY: AddressSanitizer: stack-buffer-overflow - arr[argc] = 1; // Deliberate OOB access - }); - - in.lock(); - /* - * Critical section: LSan's check acquires: - * 1. dl_iterate_phdr lock (A) - * 2. ASan's thread registry lock (B) - * before Stop The World. - */ - __lsan_do_leak_check(); - t.join(); - return 0; -} +// Test for potential deadlock in LeakSanitizer+AddressSanitizer. +// REQUIRES: leak-detection +// +// RUN: %clangxx_asan -O0 %s -o %t +// RUN: %env_asan_opts=detect_leaks=1 not %run %t 2>&1 | FileCheck %s + +/* + * Purpose: Verify deadlock prevention between ASan error reporting and LSan leak checking. + * + * Test Design: + * 1. Creates contention scenario between: + * - ASan's error reporting (requires lock B -> lock A ordering) + * - LSan's leak check (requires lock A -> lock B ordering) + * 2. Thread timing: + * - Main thread: Holds 'in' mutex -> Triggers LSan check (lock A then B) + * - Worker thread: Triggers ASan OOB error (lock B then A via symbolization) + * + * Deadlock Condition (if unfixed): + * Circular lock dependency forms when: + * [Main Thread] LSan: lock A -> requests lock B + * [Worker Thread] ASan: lock B -> requests lock A + * + * Success Criteria: + * With proper lock ordering enforcement, watchdog should NOT trigger - test exits normally. + * If deadlock occurs, watchdog terminates via _exit(1) after 10s timeout. + */ + +#include +#include +#include +#include +#include + +void Watchdog() { + // Safety mechanism: Turn infinite deadlock into finite test failure + usleep(10000000); + // CHECK-NOT: Timeout! Deadlock detected. + puts("Timeout! Deadlock detected."); + fflush(stdout); + _exit(1); +} + +int main(int argc, char **argv) { + int arr[1] = {0}; + std::mutex in; + in.lock(); + + std::thread w(Watchdog); + w.detach(); + + std::thread t([&]() { + in.unlock(); + /* + * Provoke ASan error: ASan's error reporting acquires: + * 1. ASan's thread registry lock (B) during the reporting + * 2. dl_iterate_phdr lock (A) during symbolization + */ + // CHECK: SUMMARY: AddressSanitizer: stack-buffer-overflow + arr[argc] = 1; // Deliberate OOB access + }); + + in.lock(); + /* + * Critical section: LSan's check acquires: + * 1. dl_iterate_phdr lock (A) + * 2. ASan's thread registry lock (B) + * before Stop The World. + */ + __lsan_do_leak_check(); + t.join(); + return 0; +}