2222using namespace __rtsan ;
2323using namespace __sanitizer ;
2424
25+ namespace {
26+ enum class InitializationState : u8 {
27+ Uninitialized,
28+ Initializing,
29+ Initialized,
30+ };
31+ } // namespace
32+
2533static StaticSpinMutex rtsan_inited_mutex;
2634static atomic_uint8_t rtsan_initialized = {0 };
2735
28- static void SetInitialized () {
29- atomic_store (&rtsan_initialized, 1 , memory_order_release);
36+ static void SetInitializationState (InitializationState state) {
37+ atomic_store (&rtsan_initialized, static_cast <u8 >(state),
38+ memory_order_release);
39+ }
40+
41+ static InitializationState GetInitializationState () {
42+ return static_cast <InitializationState>(
43+ atomic_load (&rtsan_initialized, memory_order_acquire));
3044}
3145
3246static auto PrintDiagnosticsAndDieAction (DiagnosticsInfo info) {
@@ -39,13 +53,14 @@ static auto PrintDiagnosticsAndDieAction(DiagnosticsInfo info) {
3953extern " C" {
4054
4155SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_init () {
42- CHECK (!__rtsan_is_initialized ());
56+ CHECK (GetInitializationState () == InitializationState::Uninitialized);
57+ SetInitializationState (InitializationState::Initializing);
4358
4459 SanitizerToolName = " RealtimeSanitizer" ;
4560 InitializeFlags ();
4661 InitializeInterceptors ();
4762
48- SetInitialized ( );
63+ SetInitializationState (InitializationState::Initialized );
4964}
5065
5166SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_ensure_initialized () {
@@ -62,7 +77,7 @@ SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_ensure_initialized() {
6277}
6378
6479SANITIZER_INTERFACE_ATTRIBUTE bool __rtsan_is_initialized () {
65- return atomic_load (&rtsan_initialized, memory_order_acquire ) == 1 ;
80+ return GetInitializationState ( ) == InitializationState::Initialized ;
6681}
6782
6883SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_realtime_enter () {
@@ -83,6 +98,10 @@ SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_enable() {
8398
8499SANITIZER_INTERFACE_ATTRIBUTE void
85100__rtsan_notify_intercepted_call (const char *func_name) {
101+ // While initializing, we need all intercepted functions to behave normally
102+ if (GetInitializationState () == InitializationState::Initializing)
103+ return ;
104+
86105 __rtsan_ensure_initialized ();
87106 GET_CALLER_PC_BP;
88107 ExpectNotRealtime (
0 commit comments