annotate libsanitizer/asan/asan_new_delete.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- asan_interceptors.cpp ---------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // This file is a part of AddressSanitizer, an address sanity checker.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 // Interceptors for operators new and delete.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "asan_allocator.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "asan_internal.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #include "asan_malloc_local.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 #include "asan_report.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #include "asan_stack.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "interception/interception.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include <stddef.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 // C++ operators can't have dllexport attributes on Windows. We export them
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 // anyway by passing extra -export flags to the linker, which is exactly that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 // dllexport would normally do. We need to export them in order to make the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 // VS2015 dynamic CRT (MD) work.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #if SANITIZER_WINDOWS && defined(_MSC_VER)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #define CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #define COMMENT_EXPORT(sym) __pragma(comment(linker, "/export:" sym))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #ifdef _WIN64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 COMMENT_EXPORT("??2@YAPEAX_K@Z") // operator new
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 COMMENT_EXPORT("??2@YAPEAX_KAEBUnothrow_t@std@@@Z") // operator new nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 COMMENT_EXPORT("??3@YAXPEAX@Z") // operator delete
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 COMMENT_EXPORT("??3@YAXPEAX_K@Z") // sized operator delete
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 COMMENT_EXPORT("??_U@YAPEAX_K@Z") // operator new[]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 COMMENT_EXPORT("??_V@YAXPEAX@Z") // operator delete[]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 COMMENT_EXPORT("??2@YAPAXI@Z") // operator new
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 COMMENT_EXPORT("??2@YAPAXIABUnothrow_t@std@@@Z") // operator new nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 COMMENT_EXPORT("??3@YAXPAX@Z") // operator delete
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 COMMENT_EXPORT("??3@YAXPAXI@Z") // sized operator delete
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 COMMENT_EXPORT("??_U@YAPAXI@Z") // operator new[]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 COMMENT_EXPORT("??_V@YAXPAX@Z") // operator delete[]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 #undef COMMENT_EXPORT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 #define CXX_OPERATOR_ATTRIBUTE INTERCEPTOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 using namespace __asan;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 // FreeBSD prior v9.2 have wrong definition of 'size_t'.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 // http://svnweb.freebsd.org/base?view=revision&revision=232261
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 #if SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 #include <sys/param.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 #if __FreeBSD_version <= 902001 // v9.2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 #define size_t unsigned
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 #endif // __FreeBSD_version
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 #endif // SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 // This code has issues on OSX.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 // See https://github.com/google/sanitizers/issues/131.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 // Fake std::nothrow_t and std::align_val_t to avoid including <new>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 namespace std {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 struct nothrow_t {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 enum class align_val_t: size_t {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 } // namespace std
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 // TODO(alekseyshl): throw std::bad_alloc instead of dying on OOM.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 // For local pool allocation, align to SHADOW_GRANULARITY to match asan
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 // allocator behavior.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 #define OPERATOR_NEW_BODY(type, nothrow) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 MAYBE_ALLOCATE_FROM_LOCAL_POOL(nothrow); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 GET_STACK_TRACE_MALLOC; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 void *res = asan_memalign(0, size, &stack, type); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 if (!nothrow && UNLIKELY(!res)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 ReportOutOfMemory(size, &stack); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 return res;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 #define OPERATOR_NEW_BODY_ALIGN(type, nothrow) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 MAYBE_ALLOCATE_FROM_LOCAL_POOL(nothrow); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 GET_STACK_TRACE_MALLOC; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 void *res = asan_memalign((uptr)align, size, &stack, type); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 if (!nothrow && UNLIKELY(!res)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 ReportOutOfMemory(size, &stack); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 return res;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 // On OS X it's not enough to just provide our own 'operator new' and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 // 'operator delete' implementations, because they're going to be in the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 // runtime dylib, and the main executable will depend on both the runtime
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 // dylib and libstdc++, each of those'll have its implementation of new and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 // delete.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 // To make sure that C++ allocation/deallocation operators are overridden on
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 // OS X we need to intercept them using their mangled names.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 #if !SANITIZER_MAC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 void *operator new(size_t size)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 { OPERATOR_NEW_BODY(FROM_NEW, false /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 void *operator new[](size_t size)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 { OPERATOR_NEW_BODY(FROM_NEW_BR, false /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 void *operator new(size_t size, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 { OPERATOR_NEW_BODY(FROM_NEW, true /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 void *operator new[](size_t size, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 { OPERATOR_NEW_BODY(FROM_NEW_BR, true /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 void *operator new(size_t size, std::align_val_t align)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 { OPERATOR_NEW_BODY_ALIGN(FROM_NEW, false /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 void *operator new[](size_t size, std::align_val_t align)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 { OPERATOR_NEW_BODY_ALIGN(FROM_NEW_BR, false /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 void *operator new(size_t size, std::align_val_t align, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 { OPERATOR_NEW_BODY_ALIGN(FROM_NEW, true /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 void *operator new[](size_t size, std::align_val_t align, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 { OPERATOR_NEW_BODY_ALIGN(FROM_NEW_BR, true /*nothrow*/); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 #else // SANITIZER_MAC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 INTERCEPTOR(void *, _Znwm, size_t size) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 OPERATOR_NEW_BODY(FROM_NEW, false /*nothrow*/);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 INTERCEPTOR(void *, _Znam, size_t size) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 OPERATOR_NEW_BODY(FROM_NEW_BR, false /*nothrow*/);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 INTERCEPTOR(void *, _ZnwmRKSt9nothrow_t, size_t size, std::nothrow_t const&) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 OPERATOR_NEW_BODY(FROM_NEW, true /*nothrow*/);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 INTERCEPTOR(void *, _ZnamRKSt9nothrow_t, size_t size, std::nothrow_t const&) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 OPERATOR_NEW_BODY(FROM_NEW_BR, true /*nothrow*/);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 #endif // !SANITIZER_MAC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 #define OPERATOR_DELETE_BODY(type) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 if (IS_FROM_LOCAL_POOL(ptr)) return;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 GET_STACK_TRACE_FREE;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 asan_delete(ptr, 0, 0, &stack, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 #define OPERATOR_DELETE_BODY_SIZE(type) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 if (IS_FROM_LOCAL_POOL(ptr)) return;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 GET_STACK_TRACE_FREE;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 asan_delete(ptr, size, 0, &stack, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 #define OPERATOR_DELETE_BODY_ALIGN(type) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 if (IS_FROM_LOCAL_POOL(ptr)) return;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 GET_STACK_TRACE_FREE;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 asan_delete(ptr, 0, static_cast<uptr>(align), &stack, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 #define OPERATOR_DELETE_BODY_SIZE_ALIGN(type) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 if (IS_FROM_LOCAL_POOL(ptr)) return;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 GET_STACK_TRACE_FREE;\
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 asan_delete(ptr, size, static_cast<uptr>(align), &stack, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 #if !SANITIZER_MAC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 void operator delete(void *ptr) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 { OPERATOR_DELETE_BODY(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 void operator delete[](void *ptr) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 { OPERATOR_DELETE_BODY(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 void operator delete(void *ptr, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 { OPERATOR_DELETE_BODY(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 void operator delete[](void *ptr, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 { OPERATOR_DELETE_BODY(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 void operator delete(void *ptr, size_t size) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 { OPERATOR_DELETE_BODY_SIZE(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 void operator delete[](void *ptr, size_t size) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 { OPERATOR_DELETE_BODY_SIZE(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 void operator delete(void *ptr, std::align_val_t align) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 { OPERATOR_DELETE_BODY_ALIGN(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 { OPERATOR_DELETE_BODY_ALIGN(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 { OPERATOR_DELETE_BODY_ALIGN(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 void operator delete[](void *ptr, std::align_val_t align, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 { OPERATOR_DELETE_BODY_ALIGN(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 void operator delete(void *ptr, size_t size, std::align_val_t align) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 { OPERATOR_DELETE_BODY_SIZE_ALIGN(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 CXX_OPERATOR_ATTRIBUTE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 void operator delete[](void *ptr, size_t size, std::align_val_t align) NOEXCEPT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 { OPERATOR_DELETE_BODY_SIZE_ALIGN(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 #else // SANITIZER_MAC
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 INTERCEPTOR(void, _ZdlPv, void *ptr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 { OPERATOR_DELETE_BODY(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 INTERCEPTOR(void, _ZdaPv, void *ptr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 { OPERATOR_DELETE_BODY(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 INTERCEPTOR(void, _ZdlPvRKSt9nothrow_t, void *ptr, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 { OPERATOR_DELETE_BODY(FROM_NEW); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 INTERCEPTOR(void, _ZdaPvRKSt9nothrow_t, void *ptr, std::nothrow_t const&)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 { OPERATOR_DELETE_BODY(FROM_NEW_BR); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 #endif // !SANITIZER_MAC