xref: /llvm-project/libc/src/__support/macros/sanitizer.h (revision 1896ee38898a73ea9c2894e848884c8999884ab1)
164730095SGuillaume Chatelet //===-- Convenient sanitizer macros -----------------------------*- C++ -*-===//
264730095SGuillaume Chatelet //
364730095SGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
464730095SGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information.
564730095SGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
664730095SGuillaume Chatelet //
764730095SGuillaume Chatelet //===----------------------------------------------------------------------===//
864730095SGuillaume Chatelet 
9270547f3SGuillaume Chatelet #ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
10270547f3SGuillaume Chatelet #define LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
1164730095SGuillaume Chatelet 
126fb61ed5SGuillaume Chatelet #include "src/__support/macros/config.h" //LIBC_HAS_FEATURE
1364730095SGuillaume Chatelet 
1464730095SGuillaume Chatelet //-----------------------------------------------------------------------------
1564730095SGuillaume Chatelet // Functions to unpoison memory
1664730095SGuillaume Chatelet //-----------------------------------------------------------------------------
1764730095SGuillaume Chatelet 
18*1896ee38Slntue #if LIBC_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
19*1896ee38Slntue #define LIBC_HAS_ADDRESS_SANITIZER
20*1896ee38Slntue #endif
21*1896ee38Slntue 
22f7c673daSFangrui Song #if LIBC_HAS_FEATURE(memory_sanitizer)
23*1896ee38Slntue #define LIBC_HAS_MEMORY_SANITIZER
24*1896ee38Slntue #endif
25*1896ee38Slntue 
26*1896ee38Slntue #if LIBC_HAS_FEATURE(undefined_behavior_sanitizer)
27*1896ee38Slntue #define LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER
28*1896ee38Slntue #endif
29*1896ee38Slntue 
30*1896ee38Slntue #if defined(LIBC_HAS_ADDRESS_SANITIZER) ||                                     \
31*1896ee38Slntue     defined(LIBC_HAS_MEMORY_SANITIZER) ||                                      \
32*1896ee38Slntue     defined(LIBC_HAS_UNDEFINED_BEHAVIOR_SANITIZER)
33*1896ee38Slntue #define LIBC_HAS_SANITIZER
34*1896ee38Slntue #endif
35*1896ee38Slntue 
36*1896ee38Slntue #ifdef LIBC_HAS_MEMORY_SANITIZER
370177c1c4Slntue // Only perform MSAN unpoison in non-constexpr context.
3864730095SGuillaume Chatelet #include <sanitizer/msan_interface.h>
390177c1c4Slntue #define MSAN_UNPOISON(addr, size)                                              \
400177c1c4Slntue   do {                                                                         \
41889dfd4aSGuillaume Chatelet     if (!__builtin_is_constant_evaluated())                                    \
420177c1c4Slntue       __msan_unpoison(addr, size);                                             \
430177c1c4Slntue   } while (0)
4464730095SGuillaume Chatelet #else
45e2263f14SGuillaume Chatelet #define MSAN_UNPOISON(ptr, size)
4664730095SGuillaume Chatelet #endif
47e2263f14SGuillaume Chatelet 
48*1896ee38Slntue #ifdef LIBC_HAS_ADDRESS_SANITIZER
49e2263f14SGuillaume Chatelet #include <sanitizer/asan_interface.h>
50e2263f14SGuillaume Chatelet #define ASAN_POISON_MEMORY_REGION(addr, size)                                  \
51e2263f14SGuillaume Chatelet   __asan_poison_memory_region((addr), (size))
52e2263f14SGuillaume Chatelet #define ASAN_UNPOISON_MEMORY_REGION(addr, size)                                \
53e2263f14SGuillaume Chatelet   __asan_unpoison_memory_region((addr), (size))
54e2263f14SGuillaume Chatelet #else
55e2263f14SGuillaume Chatelet #define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
56e2263f14SGuillaume Chatelet #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
57e2263f14SGuillaume Chatelet #endif
58e2263f14SGuillaume Chatelet 
59270547f3SGuillaume Chatelet #endif // LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
60