diff --git a/compiler-rt/lib/radsan/radsan_context.cpp b/compiler-rt/lib/radsan/radsan_context.cpp index 1407fb38782aa..b5c1295705c7d 100644 --- a/compiler-rt/lib/radsan/radsan_context.cpp +++ b/compiler-rt/lib/radsan/radsan_context.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -29,11 +30,6 @@ void internalFree(void *ptr) { InternalFree(ptr); } namespace radsan { -Context::Context() : Context(createErrorActionGetter()) {} - -Context::Context(std::function get_error_action) - : get_error_action_(get_error_action) {} - void Context::realtimePush() { realtime_depth_++; } void Context::realtimePop() { realtime_depth_--; } @@ -46,7 +42,7 @@ void Context::expectNotRealtime(const char *intercepted_function_name) { if (inRealtimeContext() && !isBypassed()) { bypassPush(); printDiagnostics(intercepted_function_name); - if (get_error_action_() == OnErrorAction::ExitWithFailure) { + if (radsan::ShouldExit()) { exit(EXIT_FAILURE); } bypassPop(); diff --git a/compiler-rt/lib/radsan/radsan_context.h b/compiler-rt/lib/radsan/radsan_context.h index ca2f0c5735e32..9aefdecd61e32 100644 --- a/compiler-rt/lib/radsan/radsan_context.h +++ b/compiler-rt/lib/radsan/radsan_context.h @@ -10,15 +10,10 @@ #include -#include - namespace radsan { class Context { public: - Context(); - Context(std::function get_error_action); - void realtimePush(); void realtimePop(); @@ -34,7 +29,6 @@ class Context { int realtime_depth_{0}; int bypass_depth_{0}; - std::function get_error_action_; }; Context &getContextForThisThread(); diff --git a/compiler-rt/lib/radsan/radsan_user_interface.cpp b/compiler-rt/lib/radsan/radsan_user_interface.cpp index 39d26c94b3b20..8bf035881a495 100644 --- a/compiler-rt/lib/radsan/radsan_user_interface.cpp +++ b/compiler-rt/lib/radsan/radsan_user_interface.cpp @@ -17,39 +17,33 @@ namespace radsan { -std::function createErrorActionGetter() { - auto const continue_getter = []() { return OnErrorAction::Continue; }; - auto const exit_getter = []() { return OnErrorAction::ExitWithFailure; }; - auto const interactive_getter = []() { - auto response = char{}; +bool ShouldExit() { - std::cout << "Continue? (Y/n): "; - std::cin >> std::noskipws >> response; + const bool defaultShouldExit = true; - if (std::toupper(response) == 'N') - return OnErrorAction::ExitWithFailure; - else - return OnErrorAction::Continue; - }; - - auto user_mode = __sanitizer::GetEnv("RADSAN_ERROR_MODE"); + static const char* user_mode = __sanitizer::GetEnv("RADSAN_ERROR_MODE"); if (user_mode == nullptr) { - return exit_getter; + return defaultShouldExit; } if (std::strcmp(user_mode, "interactive") == 0) { - return interactive_getter; + auto response = char{}; + + std::cout << "Continue? (Y/n): "; + std::cin >> std::noskipws >> response; + + return std::toupper(response) == 'N'; } if (std::strcmp(user_mode, "continue") == 0) { - return continue_getter; + return false; } if (std::strcmp(user_mode, "exit") == 0) { - return exit_getter; + return true; } - return exit_getter; + return defaultShouldExit; } } // namespace radsan diff --git a/compiler-rt/lib/radsan/radsan_user_interface.h b/compiler-rt/lib/radsan/radsan_user_interface.h index 231d3f37740a8..9a4e5e2c05ec3 100644 --- a/compiler-rt/lib/radsan/radsan_user_interface.h +++ b/compiler-rt/lib/radsan/radsan_user_interface.h @@ -1,14 +1,7 @@ #pragma once -#include - namespace radsan { -enum class OnErrorAction { - Continue, - ExitWithFailure, -}; - -std::function createErrorActionGetter(); +bool ShouldExit(); -} +} // namespace radsan diff --git a/compiler-rt/lib/radsan/tests/radsan_test_context.cpp b/compiler-rt/lib/radsan/tests/radsan_test_context.cpp index 4ff1c37e04be8..c342665a5b509 100644 --- a/compiler-rt/lib/radsan/tests/radsan_test_context.cpp +++ b/compiler-rt/lib/radsan/tests/radsan_test_context.cpp @@ -68,14 +68,14 @@ TEST(TestRadsanContext, } TEST(TestRadsanContext, onlyDiesIfExitWithFailureReturnedFromUser) { - auto fake_action = radsan::OnErrorAction::Continue; - auto action_getter = [&fake_action]() { return fake_action; }; - auto context = radsan::Context{action_getter}; + setenv("RADSAN_ERROR_MODE", "continue", 1); + + auto context = radsan::Context{}; context.realtimePush(); context.expectNotRealtime("do_some_stuff_expecting_continue"); - fake_action = radsan::OnErrorAction::ExitWithFailure; + setenv("RADSAN_ERROR_MODE", "exit", 1); EXPECT_DEATH(context.expectNotRealtime("do_some_stuff_expecting_exit"), ""); }