MemoryChecking.h (4168B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 /* 8 * Provides a common interface to the ASan (AddressSanitizer) and Valgrind 9 * functions used to mark memory in certain ways. In detail, the following 10 * three macros are provided: 11 * 12 * MOZ_MAKE_MEM_NOACCESS - Mark memory as unsafe to access (e.g. freed) 13 * MOZ_MAKE_MEM_UNDEFINED - Mark memory as accessible, with content undefined 14 * MOZ_MAKE_MEM_DEFINED - Mark memory as accessible, with content defined 15 * 16 * With Valgrind in use, these directly map to the three respective Valgrind 17 * macros. With ASan in use, the NOACCESS macro maps to poisoning the memory, 18 * while the UNDEFINED/DEFINED macros unpoison memory. 19 * 20 * With no memory checker available, all macros expand to the empty statement. 21 */ 22 23 #ifndef mozilla_MemoryChecking_h 24 #define mozilla_MemoryChecking_h 25 26 #if defined(MOZ_VALGRIND) 27 # include "valgrind/memcheck.h" 28 #endif 29 30 #if defined(MOZ_ASAN) || defined(MOZ_VALGRIND) 31 # define MOZ_HAVE_MEM_CHECKS 1 32 #endif 33 34 #if defined(MOZ_ASAN) 35 # include <stddef.h> 36 37 # include "mozilla/Types.h" 38 39 # ifdef _MSC_VER 40 // In clang-cl based ASAN, we link against the memory poisoning functions 41 // statically. 42 # define MOZ_ASAN_VISIBILITY 43 # else 44 # define MOZ_ASAN_VISIBILITY MOZ_EXPORT 45 # endif 46 47 extern "C" { 48 /* These definitions are usually provided through the 49 * sanitizer/asan_interface.h header installed by ASan. 50 */ 51 void MOZ_ASAN_VISIBILITY __asan_poison_memory_region(void const volatile* addr, 52 size_t size); 53 void MOZ_ASAN_VISIBILITY 54 __asan_unpoison_memory_region(void const volatile* addr, size_t size); 55 56 # define MOZ_MAKE_MEM_NOACCESS(addr, size) \ 57 __asan_poison_memory_region((addr), (size)) 58 59 # define MOZ_MAKE_MEM_UNDEFINED(addr, size) \ 60 __asan_unpoison_memory_region((addr), (size)) 61 62 # define MOZ_MAKE_MEM_DEFINED(addr, size) \ 63 __asan_unpoison_memory_region((addr), (size)) 64 65 /* 66 * These definitions are usually provided through the 67 * sanitizer/lsan_interface.h header installed by LSan. 68 */ 69 void MOZ_EXPORT __lsan_ignore_object(const void* p); 70 } 71 #elif defined(MOZ_MSAN) 72 # include <stddef.h> 73 74 # include "mozilla/Types.h" 75 76 extern "C" { 77 /* These definitions are usually provided through the 78 * sanitizer/msan_interface.h header installed by MSan. 79 */ 80 void MOZ_EXPORT __msan_poison(void const volatile* addr, size_t size); 81 void MOZ_EXPORT __msan_unpoison(void const volatile* addr, size_t size); 82 83 # define MOZ_MAKE_MEM_NOACCESS(addr, size) __msan_poison((addr), (size)) 84 85 # define MOZ_MAKE_MEM_UNDEFINED(addr, size) __msan_poison((addr), (size)) 86 87 # define MOZ_MAKE_MEM_DEFINED(addr, size) __msan_unpoison((addr), (size)) 88 } 89 #elif defined(MOZ_VALGRIND) 90 # define MOZ_MAKE_MEM_NOACCESS(addr, size) \ 91 VALGRIND_MAKE_MEM_NOACCESS((addr), (size)) 92 93 # define MOZ_MAKE_MEM_UNDEFINED(addr, size) \ 94 VALGRIND_MAKE_MEM_UNDEFINED((addr), (size)) 95 96 # define MOZ_MAKE_MEM_DEFINED(addr, size) \ 97 VALGRIND_MAKE_MEM_DEFINED((addr), (size)) 98 #else 99 100 # define MOZ_MAKE_MEM_NOACCESS(addr, size) \ 101 do { \ 102 } while (0) 103 # define MOZ_MAKE_MEM_UNDEFINED(addr, size) \ 104 do { \ 105 } while (0) 106 # define MOZ_MAKE_MEM_DEFINED(addr, size) \ 107 do { \ 108 } while (0) 109 110 #endif 111 112 /* 113 * MOZ_LSAN_INTENTIONAL_LEAK(X) is a macro to tell LeakSanitizer that X 114 * points to a value that will intentionally never be deallocated during 115 * the execution of the process. 116 * 117 * Additional uses of this macro should be reviewed by people 118 * conversant in leak-checking and/or MFBT peers. 119 */ 120 #if defined(MOZ_ASAN) 121 # define MOZ_LSAN_INTENTIONALLY_LEAK_OBJECT(X) __lsan_ignore_object(X) 122 #else 123 # define MOZ_LSAN_INTENTIONALLY_LEAK_OBJECT(X) /* nothing */ 124 #endif // defined(MOZ_ASAN) 125 126 #endif /* mozilla_MemoryChecking_h */