@@ -37,12 +37,6 @@ class Decorator : public __sanitizer::SanitizerCommonDecorator {
37
37
const char *FunctionName () const { return Green (); }
38
38
const char *Reason () const { return Blue (); }
39
39
};
40
-
41
- template <class ... Ts> struct Overloaded : Ts... {
42
- using Ts::operator ()...;
43
- };
44
- // TODO: Remove below when c++20
45
- template <class ... Ts> Overloaded (Ts...) -> Overloaded<Ts...>;
46
40
} // namespace
47
41
48
42
static void PrintStackTrace (uptr pc, uptr bp) {
@@ -53,35 +47,39 @@ static void PrintStackTrace(uptr pc, uptr bp) {
53
47
}
54
48
55
49
static void PrintError (const Decorator &decorator,
56
- const DiagnosticsCallerInfo &info) {
57
- const char *violation_type = std::visit (
58
- Overloaded{
59
- [](const InterceptedCallInfo &) { return " unsafe-library-call" ; },
60
- [](const BlockingCallInfo &) { return " blocking-call" ; }},
61
- info);
50
+ const DiagnosticsInfo &info) {
51
+ const auto ErrorTypeStr = [&info]() -> const char * {
52
+ switch (info.type ) {
53
+ case DiagnosticsInfoType::InterceptedCall:
54
+ return " unsafe-library-call" ;
55
+ case DiagnosticsInfoType::BlockingCall:
56
+ return " blocking-call" ;
57
+ }
58
+ return " (unknown error)" ;
59
+ };
62
60
63
61
Printf (" %s" , decorator.Error ());
64
- Report (" ERROR: RealtimeSanitizer: %s\n " , violation_type );
62
+ Report (" ERROR: RealtimeSanitizer: %s\n " , ErrorTypeStr () );
65
63
}
66
64
67
65
static void PrintReason (const Decorator &decorator,
68
- const DiagnosticsCallerInfo &info) {
66
+ const DiagnosticsInfo &info) {
69
67
Printf (" %s" , decorator.Reason ());
70
68
71
- std::visit (
72
- Overloaded{[decorator]( const InterceptedCallInfo &call) {
73
- Printf (" Intercepted call to real-time unsafe function "
74
- " `%s%s%s` in real-time context!" ,
75
- decorator.FunctionName (),
76
- call. intercepted_function_name_ , decorator. Reason ()) ;
77
- },
78
- [decorator]( const BlockingCallInfo &arg) {
79
- Printf (" Call to blocking function "
80
- " `%s%s%s` in real-time context!" ,
81
- decorator.FunctionName (), arg. blocking_function_name_ ,
82
- decorator. Reason ()) ;
83
- }},
84
- info);
69
+ switch (info. type ) {
70
+ case DiagnosticsInfoType::InterceptedCall: {
71
+ Printf (" Intercepted call to real-time unsafe function "
72
+ " `%s%s%s` in real-time context!" ,
73
+ decorator.FunctionName (), info. func_name , decorator. Reason ());
74
+ break ;
75
+ }
76
+ case DiagnosticsInfoType::BlockingCall: {
77
+ Printf (" Call to blocking function "
78
+ " `%s%s%s` in real-time context!" ,
79
+ decorator.FunctionName (), info. func_name , decorator. Reason ());
80
+ break ;
81
+ }
82
+ }
85
83
86
84
Printf (" \n " );
87
85
}
@@ -90,8 +88,8 @@ void __rtsan::PrintDiagnostics(const DiagnosticsInfo &info) {
90
88
ScopedErrorReportLock l;
91
89
92
90
Decorator d;
93
- PrintError (d, info. call_info );
94
- PrintReason (d, info. call_info );
91
+ PrintError (d, info);
92
+ PrintReason (d, info);
95
93
Printf (" %s" , d.Default ());
96
94
PrintStackTrace (info.pc , info.bp );
97
95
}
0 commit comments