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