From 0b06af91463d5b6068ad794ac7307075440f8e4b Mon Sep 17 00:00:00 2001 From: Peter Dillinger Date: Tue, 1 Dec 2020 10:15:36 -0800 Subject: [PATCH] Warn about practically unfixable TSAN warnings in stack trace (#7723) Summary: TSAN reports that our stack trace handler makes unsafe calls during a signal handler. I just tried fixing some of them and I don't think it's fixable unless we can get away from using FILE stdio. Even if we can use lower level functions only, I'm not sure it's fixed. I also tried suppressing the reports with function and file level TSAN suppression, but that doesn't seem to work, perhaps because the violation is reported on the callee, not the caller. So I added a warning to be printed whenever these violations would be reported that they are practically ignorable. Internal ref: T77844138 Pull Request resolved: https://github.com/facebook/rocksdb/pull/7723 Test Plan: run external_sst_file_test with seeded abort(), with TSAN (TSAN warnings + new warning) and without TSAN (no warning, just stack trace). Reviewed By: akankshamahajan15 Differential Revision: D25228011 Pulled By: pdillinger fbshipit-source-id: 3eda1d6e7ca3cdc64076cf99ae954168837d2818 --- port/stack_trace.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/port/stack_trace.cc b/port/stack_trace.cc index dee8bd9ce..00970f9d6 100644 --- a/port/stack_trace.cc +++ b/port/stack_trace.cc @@ -144,6 +144,22 @@ static void StackTraceHandler(int sig) { fprintf(stderr, "Received signal %d (%s)\n", sig, strsignal(sig)); // skip the top three signal handler related frames PrintStack(3); + + // Efforts to fix or suppress TSAN warnings "signal-unsafe call inside of + // a signal" have failed, so just warn the user about them. +#if defined(__clang__) && defined(__has_feature) +#if __has_feature(thread_sanitizer) + fprintf(stderr, + "==> NOTE: any above warnings about \"signal-unsafe call\" are\n" + "==> ignorable, as they are expected when generating a stack\n" + "==> trace because of a signal under TSAN. Consider why the\n" + "==> signal was generated to begin with, and the stack trace\n" + "==> in the TSAN warning can be useful for that. (The stack\n" + "==> trace printed by the signal handler is likely obscured\n" + "==> by TSAN output.)\n"); +#endif +#endif + // re-signal to default handler (so we still get core dump if needed...) raise(sig); }