Skip to content

Commit 5cf4537

Browse files
authored
hwasan: refactor new/delete interceptor macros (#146698)
Same as #146696 but for #145357. --------- Signed-off-by: Justin King <jcking@google.com>
1 parent 9293b65 commit 5cf4537

File tree

1 file changed

+85
-27
lines changed

1 file changed

+85
-27
lines changed

compiler-rt/lib/hwasan/hwasan_new_delete.cpp

Lines changed: 85 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,90 @@
2222
#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
2323

2424
// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
25-
# define OPERATOR_NEW_BODY(nothrow) \
25+
# define OPERATOR_NEW_BODY \
2626
GET_MALLOC_STACK_TRACE; \
2727
void *res = hwasan_malloc(size, &stack); \
28-
if (!nothrow && UNLIKELY(!res)) \
28+
if (UNLIKELY(!res)) \
2929
ReportOutOfMemory(size, &stack); \
3030
return res
31-
# define OPERATOR_NEW_ALIGN_BODY(nothrow) \
31+
# define OPERATOR_NEW_BODY_NOTHROW \
32+
GET_MALLOC_STACK_TRACE; \
33+
return hwasan_malloc(size, &stack)
34+
# define OPERATOR_NEW_BODY_ARRAY \
35+
GET_MALLOC_STACK_TRACE; \
36+
void *res = hwasan_malloc(size, &stack); \
37+
if (UNLIKELY(!res)) \
38+
ReportOutOfMemory(size, &stack); \
39+
return res
40+
# define OPERATOR_NEW_BODY_ARRAY_NOTHROW \
41+
GET_MALLOC_STACK_TRACE; \
42+
return hwasan_malloc(size, &stack)
43+
# define OPERATOR_NEW_BODY_ALIGN \
44+
GET_MALLOC_STACK_TRACE; \
45+
void *res = hwasan_memalign(static_cast<uptr>(align), size, &stack); \
46+
if (UNLIKELY(!res)) \
47+
ReportOutOfMemory(size, &stack); \
48+
return res
49+
# define OPERATOR_NEW_BODY_ALIGN_NOTHROW \
50+
GET_MALLOC_STACK_TRACE; \
51+
return hwasan_memalign(static_cast<uptr>(align), size, &stack)
52+
# define OPERATOR_NEW_BODY_ALIGN_ARRAY \
3253
GET_MALLOC_STACK_TRACE; \
3354
void *res = hwasan_memalign(static_cast<uptr>(align), size, &stack); \
34-
if (!nothrow && UNLIKELY(!res)) \
55+
if (UNLIKELY(!res)) \
3556
ReportOutOfMemory(size, &stack); \
3657
return res
58+
# define OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW \
59+
GET_MALLOC_STACK_TRACE; \
60+
return hwasan_memalign(static_cast<uptr>(align), size, &stack)
3761

3862
# define OPERATOR_DELETE_BODY \
3963
GET_MALLOC_STACK_TRACE; \
4064
if (ptr) \
4165
hwasan_free(ptr, &stack)
66+
# define OPERATOR_DELETE_BODY_ARRAY \
67+
GET_MALLOC_STACK_TRACE; \
68+
if (ptr) \
69+
hwasan_free(ptr, &stack)
70+
# define OPERATOR_DELETE_BODY_ALIGN \
71+
GET_MALLOC_STACK_TRACE; \
72+
if (ptr) \
73+
hwasan_free(ptr, &stack)
74+
# define OPERATOR_DELETE_BODY_ALIGN_ARRAY \
75+
GET_MALLOC_STACK_TRACE; \
76+
if (ptr) \
77+
hwasan_free(ptr, &stack)
78+
# define OPERATOR_DELETE_BODY_SIZE \
79+
GET_MALLOC_STACK_TRACE; \
80+
if (ptr) \
81+
hwasan_free(ptr, &stack)
82+
# define OPERATOR_DELETE_BODY_SIZE_ARRAY \
83+
GET_MALLOC_STACK_TRACE; \
84+
if (ptr) \
85+
hwasan_free(ptr, &stack)
86+
# define OPERATOR_DELETE_BODY_SIZE_ALIGN \
87+
GET_MALLOC_STACK_TRACE; \
88+
if (ptr) \
89+
hwasan_free(ptr, &stack)
90+
# define OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY \
91+
GET_MALLOC_STACK_TRACE; \
92+
if (ptr) \
93+
hwasan_free(ptr, &stack)
4294

4395
#elif defined(__ANDROID__)
4496

4597
// We don't actually want to intercept operator new and delete on Android, but
4698
// since we previously released a runtime that intercepted these functions,
4799
// removing the interceptors would break ABI. Therefore we simply forward to
48100
// malloc and free.
49-
# define OPERATOR_NEW_BODY(nothrow) return malloc(size)
101+
# define OPERATOR_NEW_BODY return malloc(size)
102+
# define OPERATOR_NEW_BODY_NOTHROW return malloc(size)
103+
# define OPERATOR_NEW_BODY_ARRAY return malloc(size)
104+
# define OPERATOR_NEW_BODY_ARRAY_NOTHROW return malloc(size)
50105
# define OPERATOR_DELETE_BODY free(ptr)
106+
# define OPERATOR_DELETE_BODY_ARRAY free(ptr)
107+
# define OPERATOR_DELETE_BODY_SIZE free(ptr)
108+
# define OPERATOR_DELETE_BODY_SIZE_ARRAY free(ptr)
51109

52110
#endif
53111

@@ -61,19 +119,19 @@ struct nothrow_t {};
61119
} // namespace std
62120

63121
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(size_t size) {
64-
OPERATOR_NEW_BODY(false /*nothrow*/);
122+
OPERATOR_NEW_BODY;
65123
}
66124
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
67125
size_t size) {
68-
OPERATOR_NEW_BODY(false /*nothrow*/);
126+
OPERATOR_NEW_BODY_ARRAY;
69127
}
70128
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(
71129
size_t size, std::nothrow_t const &) {
72-
OPERATOR_NEW_BODY(true /*nothrow*/);
130+
OPERATOR_NEW_BODY_NOTHROW;
73131
}
74132
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
75133
size_t size, std::nothrow_t const &) {
76-
OPERATOR_NEW_BODY(true /*nothrow*/);
134+
OPERATOR_NEW_BODY_ARRAY_NOTHROW;
77135
}
78136

79137
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
@@ -82,81 +140,81 @@ INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
82140
}
83141
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
84142
void *ptr) NOEXCEPT {
85-
OPERATOR_DELETE_BODY;
143+
OPERATOR_DELETE_BODY_ARRAY;
86144
}
87145
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
88146
void *ptr, std::nothrow_t const &) {
89147
OPERATOR_DELETE_BODY;
90148
}
91149
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
92150
void *ptr, std::nothrow_t const &) {
93-
OPERATOR_DELETE_BODY;
151+
OPERATOR_DELETE_BODY_ARRAY;
94152
}
95153
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
96154
void *ptr, size_t) NOEXCEPT {
97-
OPERATOR_DELETE_BODY;
155+
OPERATOR_DELETE_BODY_SIZE;
98156
}
99157
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
100158
void *ptr, size_t) NOEXCEPT {
101-
OPERATOR_DELETE_BODY;
159+
OPERATOR_DELETE_BODY_SIZE_ARRAY;
102160
}
103161

104162
#endif // OPERATOR_NEW_BODY
105163

106-
#ifdef OPERATOR_NEW_ALIGN_BODY
164+
#ifdef OPERATOR_NEW_BODY_ALIGN
107165

108166
namespace std {
109167
enum class align_val_t : size_t {};
110168
} // namespace std
111169

112170
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(
113171
size_t size, std::align_val_t align) {
114-
OPERATOR_NEW_ALIGN_BODY(false /*nothrow*/);
172+
OPERATOR_NEW_BODY_ALIGN;
115173
}
116174
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
117175
size_t size, std::align_val_t align) {
118-
OPERATOR_NEW_ALIGN_BODY(false /*nothrow*/);
176+
OPERATOR_NEW_BODY_ALIGN_ARRAY;
119177
}
120178
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(
121179
size_t size, std::align_val_t align, std::nothrow_t const &) {
122-
OPERATOR_NEW_ALIGN_BODY(true /*nothrow*/);
180+
OPERATOR_NEW_BODY_ALIGN_NOTHROW;
123181
}
124182
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](
125183
size_t size, std::align_val_t align, std::nothrow_t const &) {
126-
OPERATOR_NEW_ALIGN_BODY(true /*nothrow*/);
184+
OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW;
127185
}
128186

129187
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
130188
void *ptr, std::align_val_t align) NOEXCEPT {
131-
OPERATOR_DELETE_BODY;
189+
OPERATOR_DELETE_BODY_ALIGN;
132190
}
133191
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
134192
void *ptr, std::align_val_t) NOEXCEPT {
135-
OPERATOR_DELETE_BODY;
193+
OPERATOR_DELETE_BODY_ALIGN_ARRAY;
136194
}
137195
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
138196
void *ptr, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
139-
OPERATOR_DELETE_BODY;
197+
OPERATOR_DELETE_BODY_ALIGN;
140198
}
141199
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
142200
void *ptr, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
143-
OPERATOR_DELETE_BODY;
201+
OPERATOR_DELETE_BODY_ALIGN_ARRAY;
144202
}
145203
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
146204
void *ptr, size_t, std::align_val_t) NOEXCEPT {
147-
OPERATOR_DELETE_BODY;
205+
OPERATOR_DELETE_BODY_SIZE_ALIGN;
148206
}
149207
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
150208
void *ptr, size_t, std::align_val_t) NOEXCEPT {
151-
OPERATOR_DELETE_BODY;
209+
OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY;
152210
}
153211
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
154212
void *ptr, size_t, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
155-
OPERATOR_DELETE_BODY;
213+
OPERATOR_DELETE_BODY_SIZE_ALIGN;
156214
}
157215
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](
158216
void *ptr, size_t, std::align_val_t, std::nothrow_t const &) NOEXCEPT {
159-
OPERATOR_DELETE_BODY;
217+
OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY;
160218
}
161219

162-
#endif // OPERATOR_NEW_ALIGN_BODY
220+
#endif // OPERATOR_NEW_BODY_ALIGN

0 commit comments

Comments
 (0)