xref: /aosp_15_r20/external/llvm-libc/src/__support/macros/sanitizer.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Convenient sanitizer macros -----------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
10 #define LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
11 
12 #include "src/__support/macros/config.h" //LIBC_HAS_FEATURE
13 
14 //-----------------------------------------------------------------------------
15 // Functions to unpoison memory
16 //-----------------------------------------------------------------------------
17 
18 #if LIBC_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
19 #define LIBC_HAS_ADDRESS_SANITIZER
20 #endif
21 
22 #if LIBC_HAS_FEATURE(memory_sanitizer)
23 #define LIBC_HAS_MEMORY_SANITIZER
24 #endif
25 
26 #if LIBC_HAS_FEATURE(undefined_behavior_sanitizer)
27 #define LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER
28 #endif
29 
30 #if defined(LIBC_HAS_ADDRESS_SANITIZER) ||                                     \
31     defined(LIBC_HAS_MEMORY_SANITIZER) ||                                      \
32     defined(LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER)
33 #define LIBC_HAS_SANITIZER
34 #endif
35 
36 #ifdef LIBC_HAS_MEMORY_SANITIZER
37 // Only perform MSAN unpoison in non-constexpr context.
38 #include <sanitizer/msan_interface.h>
39 #define MSAN_UNPOISON(addr, size)                                              \
40   do {                                                                         \
41     if (!__builtin_is_constant_evaluated())                                    \
42       __msan_unpoison(addr, size);                                             \
43   } while (0)
44 #else
45 #define MSAN_UNPOISON(ptr, size)
46 #endif
47 
48 #ifdef LIBC_HAS_ADDRESS_SANITIZER
49 #include <sanitizer/asan_interface.h>
50 #define ASAN_POISON_MEMORY_REGION(addr, size)                                  \
51   __asan_poison_memory_region((addr), (size))
52 #define ASAN_UNPOISON_MEMORY_REGION(addr, size)                                \
53   __asan_unpoison_memory_region((addr), (size))
54 #else
55 #define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
56 #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
57 #endif
58 
59 #endif // LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
60