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// Properties to check the presence or absence or sanitizers
16//-----------------------------------------------------------------------------
17
18// MemorySanitizer (MSan) is a detector of uninitialized reads. It consists of
19// a compiler instrumentation module and a run-time library. The
20// MEMORY_SANITIZER macro is deprecated but we will continue to honor it for
21// now.
22#ifdef LIBC_HAVE_MEMORY_SANITIZER
23#error "LIBC_HAVE_MEMORY_SANITIZER cannot be directly set."
24#elif defined(MEMORY_SANITIZER) || defined(__SANITIZE_MEMORY__) || \
25 (LIBC_HAS_FEATURE(memory_sanitizer) && !defined(__native_client__))
26#define LIBC_HAVE_MEMORY_SANITIZER
27#endif
28
29// AddressSanitizer (ASan) is a fast memory error detector. The
30// ADDRESS_SANITIZER macro is deprecated but we will continue to honor it for
31// now.
32#ifdef LIBC_HAVE_ADDRESS_SANITIZER
33#error "LIBC_HAVE_ADDRESS_SANITIZER cannot be directly set."
34#elif defined(ADDRESS_SANITIZER) || defined(__SANITIZE_ADDRESS__) || \
35 LIBC_HAS_FEATURE(address_sanitizer)
36#define LIBC_HAVE_ADDRESS_SANITIZER
37#endif
38
39// HWAddressSanitizer (HWASan) is a fast, low memory overhead error detector.
40#ifdef LIBC_HAVE_HWADDRESS_SANITIZER
41#error "LIBC_HAVE_HWADDRESS_SANITIZER cannot be directly set."
42#elif LIBC_HAS_FEATURE(hwaddress_sanitizer)
43#define LIBC_HAVE_HWADDRESS_SANITIZER
44#endif
45
46//-----------------------------------------------------------------------------
47// Functions to unpoison memory
48//-----------------------------------------------------------------------------
49
50#if defined(LIBC_HAVE_MEMORY_SANITIZER)
51// Only perform MSAN unpoison in non-constexpr context.
52#include <sanitizer/msan_interface.h>
53#define MSAN_UNPOISON(addr, size) \
54 do { \
55 if (!__builtin_is_constant_evaluated()) \
56 __msan_unpoison(addr, size); \
57 } while (0)
58#else
59#define MSAN_UNPOISON(ptr, size)
60#endif
61
62#ifdef LIBC_HAVE_ADDRESS_SANITIZER
63#include <sanitizer/asan_interface.h>
64#define ASAN_POISON_MEMORY_REGION(addr, size) \
65 __asan_poison_memory_region((addr), (size))
66#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \
67 __asan_unpoison_memory_region((addr), (size))
68#else
69#define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
70#define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
71#endif
72
73#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_SANITIZER_H
74

source code of libc/src/__support/macros/sanitizer.h