Skip to content

Commit 5d1e29d

Browse files
committed
asan: refactor new/delete interceptor macros
Signed-off-by: Justin King <jcking@google.com>
1 parent fc00256 commit 5d1e29d

File tree

1 file changed

+83
-60
lines changed

1 file changed

+83
-60
lines changed

compiler-rt/lib/asan/asan_new_delete.cpp

Lines changed: 83 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -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); \
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); \
6868
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); \
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); \
7477
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
84108
CXX_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; }
88110
CXX_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; }
92112
CXX_OPERATOR_ATTRIBUTE
93113
void *operator new(size_t size, std::nothrow_t const &) {
94-
OPERATOR_NEW_BODY(FROM_NEW, true /*nothrow*/);
114+
OPERATOR_NEW_BODY_NOTHROW;
95115
}
96116
CXX_OPERATOR_ATTRIBUTE
97117
void *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
}
100120
CXX_OPERATOR_ATTRIBUTE
101121
void *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
}
104124
CXX_OPERATOR_ATTRIBUTE
105125
void *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
}
108128
CXX_OPERATOR_ATTRIBUTE
109129
void *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
}
113133
CXX_OPERATOR_ATTRIBUTE
114134
void *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; }
126142
INTERCEPTOR(void *, _ZnwmRKSt9nothrow_t, size_t size, std::nothrow_t const&) {
127-
OPERATOR_NEW_BODY(FROM_NEW, true /*nothrow*/);
143+
OPERATOR_NEW_BODY_NOTHROW;
128144
}
129145
INTERCEPTOR(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
151176
CXX_OPERATOR_ATTRIBUTE
152-
void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY(FROM_NEW); }
177+
void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
153178
CXX_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; }
157180
CXX_OPERATOR_ATTRIBUTE
158181
void operator delete(void *ptr, std::nothrow_t const &) {
159-
OPERATOR_DELETE_BODY(FROM_NEW);
182+
OPERATOR_DELETE_BODY;
160183
}
161184
CXX_OPERATOR_ATTRIBUTE
162185
void operator delete[](void *ptr, std::nothrow_t const &) {
163-
OPERATOR_DELETE_BODY(FROM_NEW_BR);
186+
OPERATOR_DELETE_BODY_ARRAY;
164187
}
165188
CXX_OPERATOR_ATTRIBUTE
166189
void operator delete(void *ptr, size_t size) NOEXCEPT {
167-
OPERATOR_DELETE_BODY_SIZE(FROM_NEW);
190+
OPERATOR_DELETE_BODY_SIZE;
168191
}
169192
CXX_OPERATOR_ATTRIBUTE
170193
void operator delete[](void *ptr, size_t size) NOEXCEPT {
171-
OPERATOR_DELETE_BODY_SIZE(FROM_NEW_BR);
194+
OPERATOR_DELETE_BODY_SIZE_ARRAY;
172195
}
173196
CXX_OPERATOR_ATTRIBUTE
174197
void operator delete(void *ptr, std::align_val_t align) NOEXCEPT {
175-
OPERATOR_DELETE_BODY_ALIGN(FROM_NEW);
198+
OPERATOR_DELETE_BODY_ALIGN;
176199
}
177200
CXX_OPERATOR_ATTRIBUTE
178201
void 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
}
181204
CXX_OPERATOR_ATTRIBUTE
182205
void 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
}
186209
CXX_OPERATOR_ATTRIBUTE
187210
void 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
}
191214
CXX_OPERATOR_ATTRIBUTE
192215
void 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
}
195218
CXX_OPERATOR_ATTRIBUTE
196219
void 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; }
204227
INTERCEPTOR(void, _ZdlPvRKSt9nothrow_t, void *ptr, std::nothrow_t const &) {
205-
OPERATOR_DELETE_BODY(FROM_NEW);
228+
OPERATOR_DELETE_BODY;
206229
}
207230
INTERCEPTOR(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

Comments
 (0)