@@ -60,18 +60,42 @@ enum class align_val_t: size_t {};
6060// TODO(alekseyshl): throw std::bad_alloc instead of dying on OOM.
6161// For local pool allocation, align to SHADOW_GRANULARITY to match asan
6262// allocator behavior.
63- #define OPERATOR_NEW_BODY (type, nothrow ) \
64- GET_STACK_TRACE_MALLOC; \
65- void *res = asan_memalign(0 , size, &stack, type); \
66- if (!nothrow && UNLIKELY(!res)) \
67- ReportOutOfMemory (size, &stack); \
68- return res;
69- #define OPERATOR_NEW_BODY_ALIGN (type, nothrow ) \
70- GET_STACK_TRACE_MALLOC; \
71- void *res = asan_memalign((uptr)align, size, &stack, type); \
72- if (!nothrow && UNLIKELY(!res)) \
73- ReportOutOfMemory (size, &stack); \
74- return res;
63+ #define OPERATOR_NEW_BODY \
64+ GET_STACK_TRACE_MALLOC; \
65+ void *res = asan_memalign(0 , size, &stack, FROM_NEW); \
66+ if (UNLIKELY(!res)) \
67+ ReportOutOfMemory (size, &stack); \
68+ return res
69+ #define OPERATOR_NEW_BODY_NOTHROW \
70+ GET_STACK_TRACE_MALLOC; \
71+ return asan_memalign(0 , size, &stack, FROM_NEW)
72+ #define OPERATOR_NEW_BODY_ARRAY \
73+ GET_STACK_TRACE_MALLOC; \
74+ void *res = asan_memalign(0 , size, &stack, FROM_NEW_BR); \
75+ if (UNLIKELY(!res)) \
76+ ReportOutOfMemory (size, &stack); \
77+ return res
78+ #define OPERATOR_NEW_BODY_ARRAY_NOTHROW \
79+ GET_STACK_TRACE_MALLOC; \
80+ return asan_memalign(0 , size, &stack, FROM_NEW_BR)
81+ #define OPERATOR_NEW_BODY_ALIGN \
82+ GET_STACK_TRACE_MALLOC; \
83+ void *res = asan_memalign((uptr)align, size, &stack, FROM_NEW); \
84+ if (UNLIKELY(!res)) \
85+ ReportOutOfMemory (size, &stack); \
86+ return res
87+ #define OPERATOR_NEW_BODY_ALIGN_NOTHROW \
88+ GET_STACK_TRACE_MALLOC; \
89+ return asan_memalign((uptr)align, size, &stack, FROM_NEW)
90+ #define OPERATOR_NEW_BODY_ALIGN_ARRAY \
91+ GET_STACK_TRACE_MALLOC; \
92+ void *res = asan_memalign((uptr)align, size, &stack, FROM_NEW_BR); \
93+ if (UNLIKELY(!res)) \
94+ ReportOutOfMemory (size, &stack); \
95+ return res
96+ #define OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW \
97+ GET_STACK_TRACE_MALLOC; \
98+ return asan_memalign((uptr)align, size, &stack, FROM_NEW_BR)
7599
76100// On OS X it's not enough to just provide our own 'operator new' and
77101// 'operator delete' implementations, because they're going to be in the
@@ -82,129 +106,128 @@ enum class align_val_t: size_t {};
82106// OS X we need to intercept them using their mangled names.
83107#if !SANITIZER_APPLE
84108CXX_OPERATOR_ATTRIBUTE
85- void *operator new (size_t size) {
86- OPERATOR_NEW_BODY (FROM_NEW, false /* nothrow*/ );
87- }
109+ void *operator new (size_t size) { OPERATOR_NEW_BODY; }
88110CXX_OPERATOR_ATTRIBUTE
89- void *operator new [](size_t size) {
90- OPERATOR_NEW_BODY (FROM_NEW_BR, false /* nothrow*/ );
91- }
111+ void *operator new [](size_t size) { OPERATOR_NEW_BODY_ARRAY; }
92112CXX_OPERATOR_ATTRIBUTE
93113void *operator new (size_t size, std::nothrow_t const &) {
94- OPERATOR_NEW_BODY (FROM_NEW, true /* nothrow */ ) ;
114+ OPERATOR_NEW_BODY_NOTHROW ;
95115}
96116CXX_OPERATOR_ATTRIBUTE
97117void *operator new [](size_t size, std::nothrow_t const &) {
98- OPERATOR_NEW_BODY (FROM_NEW_BR, true /* nothrow */ ) ;
118+ OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
99119}
100120CXX_OPERATOR_ATTRIBUTE
101121void *operator new (size_t size, std::align_val_t align) {
102- OPERATOR_NEW_BODY_ALIGN (FROM_NEW, false /* nothrow */ ) ;
122+ OPERATOR_NEW_BODY_ALIGN;
103123}
104124CXX_OPERATOR_ATTRIBUTE
105125void *operator new [](size_t size, std::align_val_t align) {
106- OPERATOR_NEW_BODY_ALIGN (FROM_NEW_BR, false /* nothrow */ ) ;
126+ OPERATOR_NEW_BODY_ALIGN_ARRAY ;
107127}
108128CXX_OPERATOR_ATTRIBUTE
109129void *operator new (size_t size, std::align_val_t align,
110130 std::nothrow_t const &) {
111- OPERATOR_NEW_BODY_ALIGN (FROM_NEW, true /* nothrow */ ) ;
131+ OPERATOR_NEW_BODY_ALIGN_NOTHROW ;
112132}
113133CXX_OPERATOR_ATTRIBUTE
114134void *operator new [](size_t size, std::align_val_t align,
115135 std::nothrow_t const &) {
116- OPERATOR_NEW_BODY_ALIGN (FROM_NEW_BR, true /* nothrow */ ) ;
136+ OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW ;
117137}
118138
119139#else // SANITIZER_APPLE
120- INTERCEPTOR (void *, _Znwm, size_t size) {
121- OPERATOR_NEW_BODY (FROM_NEW, false /* nothrow*/ );
122- }
123- INTERCEPTOR (void *, _Znam, size_t size) {
124- OPERATOR_NEW_BODY (FROM_NEW_BR, false /* nothrow*/ );
125- }
140+ INTERCEPTOR (void *, _Znwm, size_t size) { OPERATOR_NEW_BODY; }
141+ INTERCEPTOR (void *, _Znam, size_t size) { OPERATOR_NEW_BODY_ARRAY; }
126142INTERCEPTOR (void *, _ZnwmRKSt9nothrow_t, size_t size, std::nothrow_t const &) {
127- OPERATOR_NEW_BODY (FROM_NEW, true /* nothrow */ ) ;
143+ OPERATOR_NEW_BODY_NOTHROW ;
128144}
129145INTERCEPTOR (void *, _ZnamRKSt9nothrow_t, size_t size, std::nothrow_t const &) {
130- OPERATOR_NEW_BODY (FROM_NEW_BR, true /* nothrow */ ) ;
146+ OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
131147}
132148#endif // !SANITIZER_APPLE
133149
134- #define OPERATOR_DELETE_BODY (type ) \
150+ #define OPERATOR_DELETE_BODY \
151+ GET_STACK_TRACE_FREE; \
152+ asan_delete (ptr, 0 , 0 , &stack, FROM_NEW)
153+ #define OPERATOR_DELETE_BODY_ARRAY \
135154 GET_STACK_TRACE_FREE; \
136- asan_delete (ptr, 0 , 0 , &stack, type);
137-
138- #define OPERATOR_DELETE_BODY_SIZE (type ) \
139- GET_STACK_TRACE_FREE; \
140- asan_delete (ptr, size, 0 , &stack, type);
141-
142- #define OPERATOR_DELETE_BODY_ALIGN (type ) \
155+ asan_delete (ptr, 0 , 0 , &stack, FROM_NEW_BR)
156+ #define OPERATOR_DELETE_BODY_ALIGN \
157+ GET_STACK_TRACE_FREE; \
158+ asan_delete (ptr, 0 , static_cast <uptr>(align), &stack, FROM_NEW)
159+ #define OPERATOR_DELETE_BODY_ALIGN_ARRAY \
143160 GET_STACK_TRACE_FREE; \
144- asan_delete (ptr, 0 , static_cast <uptr>(align), &stack, type);
145-
146- #define OPERATOR_DELETE_BODY_SIZE_ALIGN (type ) \
161+ asan_delete (ptr, 0 , static_cast <uptr>(align), &stack, FROM_NEW_BR)
162+ #define OPERATOR_DELETE_BODY_SIZE \
163+ GET_STACK_TRACE_FREE; \
164+ asan_delete (ptr, size, 0 , &stack, FROM_NEW)
165+ #define OPERATOR_DELETE_BODY_SIZE_ARRAY \
166+ GET_STACK_TRACE_FREE; \
167+ asan_delete (ptr, size, 0 , &stack, FROM_NEW_BR)
168+ #define OPERATOR_DELETE_BODY_SIZE_ALIGN \
169+ GET_STACK_TRACE_FREE; \
170+ asan_delete (ptr, size, static_cast <uptr>(align), &stack, FROM_NEW)
171+ #define OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY \
147172 GET_STACK_TRACE_FREE; \
148- asan_delete (ptr, size, static_cast <uptr>(align), &stack, type);
173+ asan_delete (ptr, size, static_cast <uptr>(align), &stack, FROM_NEW_BR)
149174
150175#if !SANITIZER_APPLE
151176CXX_OPERATOR_ATTRIBUTE
152- void operator delete (void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY (FROM_NEW) ; }
177+ void operator delete (void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
153178CXX_OPERATOR_ATTRIBUTE
154- void operator delete[] (void *ptr) NOEXCEPT {
155- OPERATOR_DELETE_BODY (FROM_NEW_BR);
156- }
179+ void operator delete[] (void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY_ARRAY; }
157180CXX_OPERATOR_ATTRIBUTE
158181void operator delete (void *ptr, std::nothrow_t const &) {
159- OPERATOR_DELETE_BODY (FROM_NEW) ;
182+ OPERATOR_DELETE_BODY;
160183}
161184CXX_OPERATOR_ATTRIBUTE
162185void operator delete[] (void *ptr, std::nothrow_t const &) {
163- OPERATOR_DELETE_BODY (FROM_NEW_BR) ;
186+ OPERATOR_DELETE_BODY_ARRAY ;
164187}
165188CXX_OPERATOR_ATTRIBUTE
166189void operator delete (void *ptr, size_t size) NOEXCEPT {
167- OPERATOR_DELETE_BODY_SIZE (FROM_NEW) ;
190+ OPERATOR_DELETE_BODY_SIZE;
168191}
169192CXX_OPERATOR_ATTRIBUTE
170193void operator delete[] (void *ptr, size_t size) NOEXCEPT {
171- OPERATOR_DELETE_BODY_SIZE (FROM_NEW_BR) ;
194+ OPERATOR_DELETE_BODY_SIZE_ARRAY ;
172195}
173196CXX_OPERATOR_ATTRIBUTE
174197void operator delete (void *ptr, std::align_val_t align) NOEXCEPT {
175- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW) ;
198+ OPERATOR_DELETE_BODY_ALIGN;
176199}
177200CXX_OPERATOR_ATTRIBUTE
178201void operator delete[] (void *ptr, std::align_val_t align) NOEXCEPT {
179- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW_BR) ;
202+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
180203}
181204CXX_OPERATOR_ATTRIBUTE
182205void operator delete (void *ptr, std::align_val_t align,
183206 std::nothrow_t const &) {
184- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW) ;
207+ OPERATOR_DELETE_BODY_ALIGN;
185208}
186209CXX_OPERATOR_ATTRIBUTE
187210void operator delete[] (void *ptr, std::align_val_t align,
188211 std::nothrow_t const &) {
189- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW_BR) ;
212+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
190213}
191214CXX_OPERATOR_ATTRIBUTE
192215void operator delete (void *ptr, size_t size, std::align_val_t align) NOEXCEPT {
193- OPERATOR_DELETE_BODY_SIZE_ALIGN (FROM_NEW) ;
216+ OPERATOR_DELETE_BODY_SIZE_ALIGN;
194217}
195218CXX_OPERATOR_ATTRIBUTE
196219void operator delete[] (void *ptr, size_t size,
197220 std::align_val_t align) NOEXCEPT {
198- OPERATOR_DELETE_BODY_SIZE_ALIGN (FROM_NEW_BR) ;
221+ OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
199222}
200223
201224#else // SANITIZER_APPLE
202- INTERCEPTOR (void , _ZdlPv, void *ptr) { OPERATOR_DELETE_BODY (FROM_NEW) ; }
203- INTERCEPTOR (void , _ZdaPv, void *ptr) { OPERATOR_DELETE_BODY (FROM_NEW_BR) ; }
225+ INTERCEPTOR (void , _ZdlPv, void *ptr) { OPERATOR_DELETE_BODY; }
226+ INTERCEPTOR (void , _ZdaPv, void *ptr) { OPERATOR_DELETE_BODY_ARRAY ; }
204227INTERCEPTOR (void , _ZdlPvRKSt9nothrow_t, void *ptr, std::nothrow_t const &) {
205- OPERATOR_DELETE_BODY (FROM_NEW) ;
228+ OPERATOR_DELETE_BODY;
206229}
207230INTERCEPTOR (void , _ZdaPvRKSt9nothrow_t, void *ptr, std::nothrow_t const &) {
208- OPERATOR_DELETE_BODY (FROM_NEW_BR) ;
231+ OPERATOR_DELETE_BODY_ARRAY ;
209232}
210233#endif // !SANITIZER_APPLE
0 commit comments