diff --git a/compiler-rt/lib/rtsan/rtsan.cpp b/compiler-rt/lib/rtsan/rtsan.cpp index 2afdf3c76696e..b288da64ffbe2 100644 --- a/compiler-rt/lib/rtsan/rtsan.cpp +++ b/compiler-rt/lib/rtsan/rtsan.cpp @@ -87,7 +87,8 @@ __rtsan_notify_intercepted_call(const char *func_name) { GET_CALLER_PC_BP; ExpectNotRealtime( GetContextForThisThread(), - PrintDiagnosticsAndDieAction({InterceptedCallInfo{func_name}, pc, bp})); + PrintDiagnosticsAndDieAction( + {DiagnosticsInfoType::InterceptedCall, func_name, pc, bp})); } SANITIZER_INTERFACE_ATTRIBUTE void @@ -96,7 +97,8 @@ __rtsan_notify_blocking_call(const char *func_name) { GET_CALLER_PC_BP; ExpectNotRealtime( GetContextForThisThread(), - PrintDiagnosticsAndDieAction({BlockingCallInfo{func_name}, pc, bp})); + PrintDiagnosticsAndDieAction( + {DiagnosticsInfoType::BlockingCall, func_name, pc, bp})); } } // extern "C" diff --git a/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp b/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp index ac13b0743be06..f82001f5b2057 100644 --- a/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp +++ b/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp @@ -37,12 +37,6 @@ class Decorator : public __sanitizer::SanitizerCommonDecorator { const char *FunctionName() const { return Green(); } const char *Reason() const { return Blue(); } }; - -template struct Overloaded : Ts... { - using Ts::operator()...; -}; -// TODO: Remove below when c++20 -template Overloaded(Ts...) -> Overloaded; } // namespace static void PrintStackTrace(uptr pc, uptr bp) { @@ -53,35 +47,39 @@ static void PrintStackTrace(uptr pc, uptr bp) { } static void PrintError(const Decorator &decorator, - const DiagnosticsCallerInfo &info) { - const char *violation_type = std::visit( - Overloaded{ - [](const InterceptedCallInfo &) { return "unsafe-library-call"; }, - [](const BlockingCallInfo &) { return "blocking-call"; }}, - info); + const DiagnosticsInfo &info) { + const auto ErrorTypeStr = [&info]() -> const char * { + switch (info.type) { + case DiagnosticsInfoType::InterceptedCall: + return "unsafe-library-call"; + case DiagnosticsInfoType::BlockingCall: + return "blocking-call"; + } + return "(unknown error)"; + }; Printf("%s", decorator.Error()); - Report("ERROR: RealtimeSanitizer: %s\n", violation_type); + Report("ERROR: RealtimeSanitizer: %s\n", ErrorTypeStr()); } static void PrintReason(const Decorator &decorator, - const DiagnosticsCallerInfo &info) { + const DiagnosticsInfo &info) { Printf("%s", decorator.Reason()); - std::visit( - Overloaded{[decorator](const InterceptedCallInfo &call) { - Printf("Intercepted call to real-time unsafe function " - "`%s%s%s` in real-time context!", - decorator.FunctionName(), - call.intercepted_function_name_, decorator.Reason()); - }, - [decorator](const BlockingCallInfo &arg) { - Printf("Call to blocking function " - "`%s%s%s` in real-time context!", - decorator.FunctionName(), arg.blocking_function_name_, - decorator.Reason()); - }}, - info); + switch (info.type) { + case DiagnosticsInfoType::InterceptedCall: { + Printf("Intercepted call to real-time unsafe function " + "`%s%s%s` in real-time context!", + decorator.FunctionName(), info.func_name, decorator.Reason()); + break; + } + case DiagnosticsInfoType::BlockingCall: { + Printf("Call to blocking function " + "`%s%s%s` in real-time context!", + decorator.FunctionName(), info.func_name, decorator.Reason()); + break; + } + } Printf("\n"); } @@ -90,8 +88,8 @@ void __rtsan::PrintDiagnostics(const DiagnosticsInfo &info) { ScopedErrorReportLock l; Decorator d; - PrintError(d, info.call_info); - PrintReason(d, info.call_info); + PrintError(d, info); + PrintReason(d, info); Printf("%s", d.Default()); PrintStackTrace(info.pc, info.bp); } diff --git a/compiler-rt/lib/rtsan/rtsan_diagnostics.h b/compiler-rt/lib/rtsan/rtsan_diagnostics.h index 8aec512584b30..f8a6b8a954a24 100644 --- a/compiler-rt/lib/rtsan/rtsan_diagnostics.h +++ b/compiler-rt/lib/rtsan/rtsan_diagnostics.h @@ -15,25 +15,16 @@ #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_internal_defs.h" -#include - namespace __rtsan { -struct InterceptedCallInfo { - const char *intercepted_function_name_; -}; - -struct BlockingCallInfo { -public: - const char *blocking_function_name_; +enum class DiagnosticsInfoType { + InterceptedCall, + BlockingCall, }; -using DiagnosticsCallerInfo = - std::variant; - struct DiagnosticsInfo { - DiagnosticsCallerInfo call_info; - + DiagnosticsInfoType type; + const char *func_name; __sanitizer::uptr pc; __sanitizer::uptr bp; };