4#ifndef _Stroika_Foundation_Debug_Sanitizer_h_
5#define _Stroika_Foundation_Debug_Sanitizer_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
9#if __has_include(<sanitizer/asan_interface.h>)
10#include <sanitizer/asan_interface.h>
12#if __has_include(<sanitizer/lsan_interface.h>)
13#include <sanitizer/lsan_interface.h>
15#if __has_include(<sanitizer/tsan_interface.h>)
16#include <sanitizer/tsan_interface.h>
19#if qCompilerAndStdLib_undefined_behavior_macro_Buggy
20extern "C" void __attribute__ ((weak)) __ubsan_handle_builtin_unreachable ();
30#if defined(__cplusplus)
31namespace Stroika::Foundation::Debug {
41#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer)
42#if defined(__SANITIZE_ADDRESS__)
43#define Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer 1
46#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer)
47#if defined(__has_feature)
49#define Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer __has_feature (address_sanitizer)
52#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer)
53#define Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer 0
60 constexpr bool kBuiltWithAddressSanitizer = Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer;
81#if Stroika_Foundation_Debug_Sanitizer_HAS_AddressSanitizer
84#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__ ((no_sanitize_address))
85#elif defined(__GNUC__)
86#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_ADDRESS [[gnu::no_sanitize_address]]
87#elif defined(_MSC_VER)
88#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_ADDRESS __declspec (no_sanitize_address)
91#if !defined(Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_ADDRESS)
92#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_ADDRESS
103#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer)
104#if defined(__SANITIZE_THREAD__)
105#define Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer 1
108#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer)
110#if defined(__has_feature)
111#define Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer __has_feature (thread_sanitizer)
114#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer)
115#define Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer 0
122 constexpr bool kBuiltWithThreadSanitizer = Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer;
135#if Stroika_Foundation_Debug_Sanitizer_HAS_ThreadSanitizer
136#if defined(__clang__) || defined(__GNUC__)
137#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_THREAD [[gnu::no_sanitize_thread]]
140#if !defined(Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_THREAD)
141#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_THREAD
154#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer)
155#if defined(__SANITIZE_UNDEFINED__)
156#define Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer 1
159#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer)
160#if defined(__has_feature)
163#define Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer __has_feature (undefined_behavior_sanitizer)
166#if !defined(Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer)
167#define Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer 0
176#if qCompilerAndStdLib_undefined_behavior_macro_Buggy
178 inline bool isUndefinedBehavorSanitizerRunning_ ()
181 return &__ubsan_handle_builtin_unreachable;
184 inline const bool kBuiltWithUndefinedBehaviorSanitizer = Private_::isUndefinedBehavorSanitizerRunning_ ();
186 constexpr bool kBuiltWithUndefinedBehaviorSanitizer = Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer;
200#if Stroika_Foundation_Debug_Sanitizer_HAS_UndefinedBehaviorSanitizer
201#if defined(__clang__)
202#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_UNDEFINED __attribute__ ((no_sanitize ("undefined")))
203#elif defined(__GNUC__)
204#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_UNDEFINED [[gnu::no_sanitize_undefined]]
208#if !defined(Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_UNDEFINED)
209#define Stroika_Foundation_Debug_ATTRIBUTE_NO_SANITIZE_UNDEFINED
220#include "Sanitizer.inl"