[clang] [compiler-rt] [compiler-rt] Realtime Sanitizer: Introduce Realtime Sanitizer (RTSan) backend (PR #92460)
Fangrui Song via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 3 15:10:27 PDT 2024
================
@@ -0,0 +1,97 @@
+//===--- rtsan_context.cpp - Realtime Sanitizer -----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+//===----------------------------------------------------------------------===//
+
+#include <rtsan/rtsan_context.h>
+
+#include <rtsan/rtsan_stack.h>
+
+#include <sanitizer_common/sanitizer_allocator_internal.h>
+#include <sanitizer_common/sanitizer_stacktrace.h>
+
+#include <new>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static pthread_key_t context_key;
+static pthread_once_t key_once = PTHREAD_ONCE_INIT;
+
+static void internalFree(void *ptr) { __sanitizer::InternalFree(ptr); }
+
+static __rtsan::Context &GetContextForThisThreadImpl() {
+ auto make_thread_local_context_key = []() {
+ CHECK_EQ(pthread_key_create(&context_key, internalFree), 0);
+ };
+
+ pthread_once(&key_once, make_thread_local_context_key);
+ __rtsan::Context *current_thread_context =
+ static_cast<__rtsan::Context *>(pthread_getspecific(context_key));
+ if (current_thread_context == nullptr) {
+ current_thread_context = static_cast<__rtsan::Context *>(
+ __sanitizer::InternalAlloc(sizeof(__rtsan::Context)));
+ new (current_thread_context) __rtsan::Context();
+ pthread_setspecific(context_key, current_thread_context);
+ }
+
+ return *current_thread_context;
+}
+
+/*
+ This is a placeholder stub for a future feature that will allow
+ a user to configure RTSan's behaviour when a real-time safety
+ violation is detected. The RTSan developers intend for the
+ following choices to be made available, via a RTSAN_OPTIONS
+ environment variable, in a future PR:
+
+ i) exit,
+ ii) continue, or
+ iii) wait for user input from stdin.
+
+ Until then, and to keep the first PRs small, only the exit mode
+ is available.
+*/
+static void InvokeViolationDetectedAction() { exit(EXIT_FAILURE); }
+
+namespace __rtsan {
----------------
MaskRay wrote:
https://llvm.org/docs/CodingStandards.html#use-namespace-qualifiers-to-implement-previously-declared-functions
If `using namespace __rtsan`, `.cpp` files should not need `namespace __rtsan`.
https://github.com/llvm/llvm-project/pull/92460
More information about the cfe-commits
mailing list