Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions compiler-rt/lib/rtsan/rtsan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"
58 changes: 28 additions & 30 deletions compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,6 @@ class Decorator : public __sanitizer::SanitizerCommonDecorator {
const char *FunctionName() const { return Green(); }
const char *Reason() const { return Blue(); }
};

template <class... Ts> struct Overloaded : Ts... {
using Ts::operator()...;
};
// TODO: Remove below when c++20
template <class... Ts> Overloaded(Ts...) -> Overloaded<Ts...>;
} // namespace

static void PrintStackTrace(uptr pc, uptr bp) {
Expand All @@ -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 error_type_str = [&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", error_type_str());
}

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;
}
}
Copy link
Contributor

@cjappl cjappl Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Strange styling here, but I presume it is what clang-format spit out. (the white space being not indented here

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, this is clang-format's IndentCaseLabels option at work - I've seen it as false more often than not on the codebases I've worked on, but I get it's a bit odd if you're used to indented cases


Printf("\n");
}
Expand All @@ -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);
}
19 changes: 5 additions & 14 deletions compiler-rt/lib/rtsan/rtsan_diagnostics.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,16 @@
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_internal_defs.h"

#include <variant>

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<InterceptedCallInfo, BlockingCallInfo>;

struct DiagnosticsInfo {
DiagnosticsCallerInfo call_info;

DiagnosticsInfoType type;
const char *func_name;
__sanitizer::uptr pc;
__sanitizer::uptr bp;
};
Expand Down