1*5d146c68SChris Apple //===-- sanitizer/rtsan_interface.h -----------------------------*- C++ -*-===// 2*5d146c68SChris Apple // 3*5d146c68SChris Apple // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5d146c68SChris Apple // See https://llvm.org/LICENSE.txt for license information. 5*5d146c68SChris Apple // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5d146c68SChris Apple // 7*5d146c68SChris Apple //===----------------------------------------------------------------------===// 8*5d146c68SChris Apple // 9*5d146c68SChris Apple // This file is a part of RealtimeSanitizer. 10*5d146c68SChris Apple // 11*5d146c68SChris Apple // Public interface header. 12*5d146c68SChris Apple //===----------------------------------------------------------------------===// 13*5d146c68SChris Apple 14*5d146c68SChris Apple #ifndef SANITIZER_RTSAN_INTERFACE_H 15*5d146c68SChris Apple #define SANITIZER_RTSAN_INTERFACE_H 16*5d146c68SChris Apple 17*5d146c68SChris Apple #include <sanitizer/common_interface_defs.h> 18*5d146c68SChris Apple 19*5d146c68SChris Apple #ifdef __cplusplus 20*5d146c68SChris Apple extern "C" { 21*5d146c68SChris Apple #endif // __cplusplus 22*5d146c68SChris Apple 23*5d146c68SChris Apple // Disable all RTSan error reporting. 24*5d146c68SChris Apple // Must be paired with a call to `__rtsan_enable` 25*5d146c68SChris Apple void SANITIZER_CDECL __rtsan_disable(void); 26*5d146c68SChris Apple 27*5d146c68SChris Apple // Re-enable all RTSan error reporting. 28*5d146c68SChris Apple // Must follow a call to `__rtsan_disable`. 29*5d146c68SChris Apple void SANITIZER_CDECL __rtsan_enable(void); 30*5d146c68SChris Apple 31*5d146c68SChris Apple #ifdef __cplusplus 32*5d146c68SChris Apple } // extern "C" 33*5d146c68SChris Apple 34*5d146c68SChris Apple namespace __rtsan { 35*5d146c68SChris Apple #if defined(__has_feature) && __has_feature(realtime_sanitizer) 36*5d146c68SChris Apple 37*5d146c68SChris Apple class ScopedDisabler { 38*5d146c68SChris Apple public: 39*5d146c68SChris Apple ScopedDisabler() { __rtsan_disable(); } 40*5d146c68SChris Apple ~ScopedDisabler() { __rtsan_enable(); } 41*5d146c68SChris Apple 42*5d146c68SChris Apple #if __cplusplus >= 201103L 43*5d146c68SChris Apple ScopedDisabler(const ScopedDisabler &) = delete; 44*5d146c68SChris Apple ScopedDisabler &operator=(const ScopedDisabler &) = delete; 45*5d146c68SChris Apple ScopedDisabler(ScopedDisabler &&) = delete; 46*5d146c68SChris Apple ScopedDisabler &operator=(ScopedDisabler &&) = delete; 47*5d146c68SChris Apple #else 48*5d146c68SChris Apple private: 49*5d146c68SChris Apple ScopedDisabler(const ScopedDisabler &); 50*5d146c68SChris Apple ScopedDisabler &operator=(const ScopedDisabler &); 51*5d146c68SChris Apple #endif // __cplusplus >= 201103L 52*5d146c68SChris Apple }; 53*5d146c68SChris Apple 54*5d146c68SChris Apple #else 55*5d146c68SChris Apple 56*5d146c68SChris Apple class ScopedDisabler { 57*5d146c68SChris Apple public: 58*5d146c68SChris Apple ScopedDisabler() {} 59*5d146c68SChris Apple #if __cplusplus >= 201103L 60*5d146c68SChris Apple ScopedDisabler(const ScopedDisabler &) = delete; 61*5d146c68SChris Apple ScopedDisabler &operator=(const ScopedDisabler &) = delete; 62*5d146c68SChris Apple ScopedDisabler(ScopedDisabler &&) = delete; 63*5d146c68SChris Apple ScopedDisabler &operator=(ScopedDisabler &&) = delete; 64*5d146c68SChris Apple #else 65*5d146c68SChris Apple private: 66*5d146c68SChris Apple ScopedDisabler(const ScopedDisabler &); 67*5d146c68SChris Apple ScopedDisabler &operator=(const ScopedDisabler &); 68*5d146c68SChris Apple #endif // __cplusplus >= 201103L 69*5d146c68SChris Apple }; 70*5d146c68SChris Apple 71*5d146c68SChris Apple #endif // defined(__has_feature) && __has_feature(realtime_sanitizer) 72*5d146c68SChris Apple } // namespace __rtsan 73*5d146c68SChris Apple #endif // __cplusplus 74*5d146c68SChris Apple 75*5d146c68SChris Apple #endif // SANITIZER_RTSAN_INTERFACE_H 76