@@ -60,18 +60,42 @@ enum class align_val_t: size_t {};
60
60
// TODO(alekseyshl): throw std::bad_alloc instead of dying on OOM.
61
61
// For local pool allocation, align to SHADOW_GRANULARITY to match asan
62
62
// 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)
75
99
76
100
// On OS X it's not enough to just provide our own 'operator new' and
77
101
// 'operator delete' implementations, because they're going to be in the
@@ -82,129 +106,128 @@ enum class align_val_t: size_t {};
82
106
// OS X we need to intercept them using their mangled names.
83
107
#if !SANITIZER_APPLE
84
108
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; }
88
110
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; }
92
112
CXX_OPERATOR_ATTRIBUTE
93
113
void *operator new (size_t size, std::nothrow_t const &) {
94
- OPERATOR_NEW_BODY (FROM_NEW, true /* nothrow */ ) ;
114
+ OPERATOR_NEW_BODY_NOTHROW ;
95
115
}
96
116
CXX_OPERATOR_ATTRIBUTE
97
117
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 ;
99
119
}
100
120
CXX_OPERATOR_ATTRIBUTE
101
121
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;
103
123
}
104
124
CXX_OPERATOR_ATTRIBUTE
105
125
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 ;
107
127
}
108
128
CXX_OPERATOR_ATTRIBUTE
109
129
void *operator new (size_t size, std::align_val_t align,
110
130
std::nothrow_t const &) {
111
- OPERATOR_NEW_BODY_ALIGN (FROM_NEW, true /* nothrow */ ) ;
131
+ OPERATOR_NEW_BODY_ALIGN_NOTHROW ;
112
132
}
113
133
CXX_OPERATOR_ATTRIBUTE
114
134
void *operator new [](size_t size, std::align_val_t align,
115
135
std::nothrow_t const &) {
116
- OPERATOR_NEW_BODY_ALIGN (FROM_NEW_BR, true /* nothrow */ ) ;
136
+ OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW ;
117
137
}
118
138
119
139
#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; }
126
142
INTERCEPTOR (void *, _ZnwmRKSt9nothrow_t, size_t size, std::nothrow_t const &) {
127
- OPERATOR_NEW_BODY (FROM_NEW, true /* nothrow */ ) ;
143
+ OPERATOR_NEW_BODY_NOTHROW ;
128
144
}
129
145
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 ;
131
147
}
132
148
#endif // !SANITIZER_APPLE
133
149
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 \
135
154
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 \
143
160
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 \
147
172
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)
149
174
150
175
#if !SANITIZER_APPLE
151
176
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; }
153
178
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; }
157
180
CXX_OPERATOR_ATTRIBUTE
158
181
void operator delete (void *ptr, std::nothrow_t const &) {
159
- OPERATOR_DELETE_BODY (FROM_NEW) ;
182
+ OPERATOR_DELETE_BODY;
160
183
}
161
184
CXX_OPERATOR_ATTRIBUTE
162
185
void operator delete[] (void *ptr, std::nothrow_t const &) {
163
- OPERATOR_DELETE_BODY (FROM_NEW_BR) ;
186
+ OPERATOR_DELETE_BODY_ARRAY ;
164
187
}
165
188
CXX_OPERATOR_ATTRIBUTE
166
189
void operator delete (void *ptr, size_t size) NOEXCEPT {
167
- OPERATOR_DELETE_BODY_SIZE (FROM_NEW) ;
190
+ OPERATOR_DELETE_BODY_SIZE;
168
191
}
169
192
CXX_OPERATOR_ATTRIBUTE
170
193
void operator delete[] (void *ptr, size_t size) NOEXCEPT {
171
- OPERATOR_DELETE_BODY_SIZE (FROM_NEW_BR) ;
194
+ OPERATOR_DELETE_BODY_SIZE_ARRAY ;
172
195
}
173
196
CXX_OPERATOR_ATTRIBUTE
174
197
void operator delete (void *ptr, std::align_val_t align) NOEXCEPT {
175
- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW) ;
198
+ OPERATOR_DELETE_BODY_ALIGN;
176
199
}
177
200
CXX_OPERATOR_ATTRIBUTE
178
201
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 ;
180
203
}
181
204
CXX_OPERATOR_ATTRIBUTE
182
205
void operator delete (void *ptr, std::align_val_t align,
183
206
std::nothrow_t const &) {
184
- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW) ;
207
+ OPERATOR_DELETE_BODY_ALIGN;
185
208
}
186
209
CXX_OPERATOR_ATTRIBUTE
187
210
void operator delete[] (void *ptr, std::align_val_t align,
188
211
std::nothrow_t const &) {
189
- OPERATOR_DELETE_BODY_ALIGN (FROM_NEW_BR) ;
212
+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
190
213
}
191
214
CXX_OPERATOR_ATTRIBUTE
192
215
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;
194
217
}
195
218
CXX_OPERATOR_ATTRIBUTE
196
219
void operator delete[] (void *ptr, size_t size,
197
220
std::align_val_t align) NOEXCEPT {
198
- OPERATOR_DELETE_BODY_SIZE_ALIGN (FROM_NEW_BR) ;
221
+ OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
199
222
}
200
223
201
224
#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 ; }
204
227
INTERCEPTOR (void , _ZdlPvRKSt9nothrow_t, void *ptr, std::nothrow_t const &) {
205
- OPERATOR_DELETE_BODY (FROM_NEW) ;
228
+ OPERATOR_DELETE_BODY;
206
229
}
207
230
INTERCEPTOR (void , _ZdaPvRKSt9nothrow_t, void *ptr, std::nothrow_t const &) {
208
- OPERATOR_DELETE_BODY (FROM_NEW_BR) ;
231
+ OPERATOR_DELETE_BODY_ARRAY ;
209
232
}
210
233
#endif // !SANITIZER_APPLE
0 commit comments