master
 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