Skip to content

Commit 49eb25f

Browse files
committed
asan: refactor interceptor allocation/deallocation functions
Signed-off-by: Justin King <jcking@google.com>
1 parent a63f572 commit 49eb25f

File tree

8 files changed

+169
-70
lines changed

8 files changed

+169
-70
lines changed

compiler-rt/lib/asan/asan_allocator.cpp

Lines changed: 97 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -997,13 +997,8 @@ void PrintInternalAllocatorStats() {
997997
instance.PrintStats();
998998
}
999999

1000-
void asan_free(void *ptr, BufferedStackTrace *stack, AllocType alloc_type) {
1001-
instance.Deallocate(ptr, 0, 0, stack, alloc_type);
1002-
}
1003-
1004-
void asan_delete(void *ptr, uptr size, uptr alignment,
1005-
BufferedStackTrace *stack, AllocType alloc_type) {
1006-
instance.Deallocate(ptr, size, alignment, stack, alloc_type);
1000+
void asan_free(void *ptr, BufferedStackTrace *stack) {
1001+
instance.Deallocate(ptr, 0, 0, stack, FROM_MALLOC);
10071002
}
10081003

10091004
void *asan_malloc(uptr size, BufferedStackTrace *stack) {
@@ -1058,16 +1053,15 @@ void *asan_pvalloc(uptr size, BufferedStackTrace *stack) {
10581053
instance.Allocate(size, PageSize, stack, FROM_MALLOC, true));
10591054
}
10601055

1061-
void *asan_memalign(uptr alignment, uptr size, BufferedStackTrace *stack,
1062-
AllocType alloc_type) {
1056+
void *asan_memalign(uptr alignment, uptr size, BufferedStackTrace *stack) {
10631057
if (UNLIKELY(!IsPowerOfTwo(alignment))) {
10641058
errno = errno_EINVAL;
10651059
if (AllocatorMayReturnNull())
10661060
return nullptr;
10671061
ReportInvalidAllocationAlignment(alignment, stack);
10681062
}
10691063
return SetErrnoOnNull(
1070-
instance.Allocate(size, alignment, stack, alloc_type, true));
1064+
instance.Allocate(size, alignment, stack, FROM_MALLOC, true));
10711065
}
10721066

10731067
void *asan_aligned_alloc(uptr alignment, uptr size, BufferedStackTrace *stack) {
@@ -1107,6 +1101,99 @@ uptr asan_malloc_usable_size(const void *ptr, uptr pc, uptr bp) {
11071101
return usable_size;
11081102
}
11091103

1104+
namespace {
1105+
1106+
void *asan_new(uptr size, BufferedStackTrace *stack, bool array) {
1107+
return SetErrnoOnNull(
1108+
instance.Allocate(size, 0, stack, array ? FROM_NEW_BR : FROM_NEW, true));
1109+
}
1110+
1111+
void *asan_new_aligned(uptr size, uptr alignment, BufferedStackTrace *stack,
1112+
bool array) {
1113+
if (UNLIKELY(alignment == 0 || !IsPowerOfTwo(alignment))) {
1114+
errno = errno_EINVAL;
1115+
if (AllocatorMayReturnNull())
1116+
return nullptr;
1117+
ReportInvalidAllocationAlignment(alignment, stack);
1118+
}
1119+
return SetErrnoOnNull(instance.Allocate(
1120+
size, alignment, stack, array ? FROM_NEW_BR : FROM_NEW, true));
1121+
}
1122+
1123+
void asan_delete(void *ptr, BufferedStackTrace *stack, bool array) {
1124+
instance.Deallocate(ptr, 0, 0, stack, array ? FROM_NEW_BR : FROM_NEW);
1125+
}
1126+
1127+
void asan_delete_aligned(void *ptr, uptr alignment, BufferedStackTrace *stack,
1128+
bool array) {
1129+
instance.Deallocate(ptr, 0, alignment, stack, array ? FROM_NEW_BR : FROM_NEW);
1130+
}
1131+
1132+
void asan_delete_sized(void *ptr, uptr size, BufferedStackTrace *stack,
1133+
bool array) {
1134+
instance.Deallocate(ptr, size, 0, stack, array ? FROM_NEW_BR : FROM_NEW);
1135+
}
1136+
1137+
void asan_delete_sized_aligned(void *ptr, uptr size, uptr alignment,
1138+
BufferedStackTrace *stack, bool array) {
1139+
instance.Deallocate(ptr, size, alignment, stack,
1140+
array ? FROM_NEW_BR : FROM_NEW);
1141+
}
1142+
1143+
} // namespace
1144+
1145+
void *asan_new(uptr size, BufferedStackTrace *stack) {
1146+
return asan_new(size, stack, /*array=*/false);
1147+
}
1148+
1149+
void *asan_new_aligned(uptr size, uptr alignment, BufferedStackTrace *stack) {
1150+
return asan_new_aligned(size, alignment, stack, /*array=*/false);
1151+
}
1152+
1153+
void *asan_new_array(uptr size, BufferedStackTrace *stack) {
1154+
return asan_new(size, stack, /*array=*/true);
1155+
}
1156+
1157+
void *asan_new_array_aligned(uptr size, uptr alignment,
1158+
BufferedStackTrace *stack) {
1159+
return asan_new_aligned(size, alignment, stack, /*array=*/true);
1160+
}
1161+
1162+
void asan_delete(void *ptr, BufferedStackTrace *stack) {
1163+
asan_delete(ptr, stack, /*array=*/false);
1164+
}
1165+
1166+
void asan_delete_aligned(void *ptr, uptr alignment, BufferedStackTrace *stack) {
1167+
asan_delete_aligned(ptr, alignment, stack, /*array=*/false);
1168+
}
1169+
1170+
void asan_delete_sized(void *ptr, uptr size, BufferedStackTrace *stack) {
1171+
asan_delete_sized(ptr, size, stack, /*array=*/false);
1172+
}
1173+
1174+
void asan_delete_sized_aligned(void *ptr, uptr size, uptr alignment,
1175+
BufferedStackTrace *stack) {
1176+
asan_delete_sized_aligned(ptr, size, alignment, stack, /*array=*/false);
1177+
}
1178+
1179+
void asan_delete_array(void *ptr, BufferedStackTrace *stack) {
1180+
asan_delete(ptr, stack, /*array=*/true);
1181+
}
1182+
1183+
void asan_delete_array_aligned(void *ptr, uptr alignment,
1184+
BufferedStackTrace *stack) {
1185+
asan_delete_aligned(ptr, alignment, stack, /*array=*/true);
1186+
}
1187+
1188+
void asan_delete_array_sized(void *ptr, uptr size, BufferedStackTrace *stack) {
1189+
asan_delete_sized(ptr, size, stack, /*array=*/true);
1190+
}
1191+
1192+
void asan_delete_array_sized_aligned(void *ptr, uptr size, uptr alignment,
1193+
BufferedStackTrace *stack) {
1194+
asan_delete_sized_aligned(ptr, size, alignment, stack, /*array=*/true);
1195+
}
1196+
11101197
uptr asan_mz_size(const void *ptr) {
11111198
return instance.AllocationSize(reinterpret_cast<uptr>(ptr));
11121199
}

compiler-rt/lib/asan/asan_allocator.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,8 @@ struct AsanThreadLocalMallocStorage {
269269
AsanThreadLocalMallocStorage() {}
270270
};
271271

272-
void *asan_memalign(uptr alignment, uptr size, BufferedStackTrace *stack,
273-
AllocType alloc_type);
274-
void asan_free(void *ptr, BufferedStackTrace *stack, AllocType alloc_type);
275-
void asan_delete(void *ptr, uptr size, uptr alignment,
276-
BufferedStackTrace *stack, AllocType alloc_type);
272+
void *asan_memalign(uptr alignment, uptr size, BufferedStackTrace *stack);
273+
void asan_free(void *ptr, BufferedStackTrace *stack);
277274

278275
void *asan_malloc(uptr size, BufferedStackTrace *stack);
279276
void *asan_calloc(uptr nmemb, uptr size, BufferedStackTrace *stack);
@@ -288,6 +285,23 @@ int asan_posix_memalign(void **memptr, uptr alignment, uptr size,
288285
BufferedStackTrace *stack);
289286
uptr asan_malloc_usable_size(const void *ptr, uptr pc, uptr bp);
290287

288+
void *asan_new(uptr size, BufferedStackTrace *stack);
289+
void *asan_new_aligned(uptr size, uptr alignment, BufferedStackTrace *stack);
290+
void *asan_new_array(uptr size, BufferedStackTrace *stack);
291+
void *asan_new_array_aligned(uptr size, uptr alignment,
292+
BufferedStackTrace *stack);
293+
void asan_delete(void *ptr, BufferedStackTrace *stack);
294+
void asan_delete_aligned(void *ptr, uptr alignment, BufferedStackTrace *stack);
295+
void asan_delete_sized(void *ptr, uptr size, BufferedStackTrace *stack);
296+
void asan_delete_sized_aligned(void *ptr, uptr size, uptr alignment,
297+
BufferedStackTrace *stack);
298+
void asan_delete_array(void *ptr, BufferedStackTrace *stack);
299+
void asan_delete_array_aligned(void *ptr, uptr alignment,
300+
BufferedStackTrace *stack);
301+
void asan_delete_array_sized(void *ptr, uptr size, BufferedStackTrace *stack);
302+
void asan_delete_array_sized_aligned(void *ptr, uptr size, uptr alignment,
303+
BufferedStackTrace *stack);
304+
291305
uptr asan_mz_size(const void *ptr);
292306
void asan_mz_force_lock();
293307
void asan_mz_force_unlock();

compiler-rt/lib/asan/asan_mac.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void asan_dispatch_call_block_and_release(void *block) {
176176
asan_register_worker_thread(context->parent_tid, &stack);
177177
// Call the original dispatcher for the block.
178178
context->func(context->block);
179-
asan_free(context, &stack, FROM_MALLOC);
179+
asan_free(context, &stack);
180180
}
181181

182182
} // namespace __asan

compiler-rt/lib/asan/asan_malloc_linux.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ INTERCEPTOR(void, free, void *ptr) {
4949
if (DlsymAlloc::PointerIsMine(ptr))
5050
return DlsymAlloc::Free(ptr);
5151
GET_STACK_TRACE_FREE;
52-
asan_free(ptr, &stack, FROM_MALLOC);
52+
asan_free(ptr, &stack);
5353
}
5454

5555
#if SANITIZER_INTERCEPT_CFREE
5656
INTERCEPTOR(void, cfree, void *ptr) {
5757
if (DlsymAlloc::PointerIsMine(ptr))
5858
return DlsymAlloc::Free(ptr);
5959
GET_STACK_TRACE_FREE;
60-
asan_free(ptr, &stack, FROM_MALLOC);
60+
asan_free(ptr, &stack);
6161
}
6262
#endif // SANITIZER_INTERCEPT_CFREE
6363

@@ -93,12 +93,12 @@ INTERCEPTOR(void*, reallocarray, void *ptr, uptr nmemb, uptr size) {
9393
#if SANITIZER_INTERCEPT_MEMALIGN
9494
INTERCEPTOR(void*, memalign, uptr boundary, uptr size) {
9595
GET_STACK_TRACE_MALLOC;
96-
return asan_memalign(boundary, size, &stack, FROM_MALLOC);
96+
return asan_memalign(boundary, size, &stack);
9797
}
9898

9999
INTERCEPTOR(void*, __libc_memalign, uptr boundary, uptr size) {
100100
GET_STACK_TRACE_MALLOC;
101-
return asan_memalign(boundary, size, &stack, FROM_MALLOC);
101+
return asan_memalign(boundary, size, &stack);
102102
}
103103
#endif // SANITIZER_INTERCEPT_MEMALIGN
104104

compiler-rt/lib/asan/asan_malloc_mac.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ using namespace __asan;
3131
# define COMMON_MALLOC_FORCE_UNLOCK() asan_mz_force_unlock()
3232
# define COMMON_MALLOC_MEMALIGN(alignment, size) \
3333
GET_STACK_TRACE_MALLOC; \
34-
void *p = asan_memalign(alignment, size, &stack, FROM_MALLOC)
34+
void *p = asan_memalign(alignment, size, &stack)
3535
# define COMMON_MALLOC_MALLOC(size) \
3636
GET_STACK_TRACE_MALLOC; \
3737
void *p = asan_malloc(size, &stack)
@@ -46,10 +46,10 @@ using namespace __asan;
4646
int res = asan_posix_memalign(memptr, alignment, size, &stack);
4747
# define COMMON_MALLOC_VALLOC(size) \
4848
GET_STACK_TRACE_MALLOC; \
49-
void *p = asan_memalign(GetPageSizeCached(), size, &stack, FROM_MALLOC);
49+
void *p = asan_memalign(GetPageSizeCached(), size, &stack);
5050
# define COMMON_MALLOC_FREE(ptr) \
5151
GET_STACK_TRACE_FREE; \
52-
asan_free(ptr, &stack, FROM_MALLOC);
52+
asan_free(ptr, &stack);
5353
# define COMMON_MALLOC_SIZE(ptr) uptr size = asan_mz_size(ptr);
5454
# define COMMON_MALLOC_FILL_STATS(zone, stats) \
5555
AsanMallocStats malloc_stats; \

compiler-rt/lib/asan/asan_malloc_win.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ __declspec(noinline) size_t _msize_base(void *ptr) { return _msize(ptr); }
6969

7070
__declspec(noinline) void free(void *ptr) {
7171
GET_STACK_TRACE_FREE;
72-
return asan_free(ptr, &stack, FROM_MALLOC);
72+
return asan_free(ptr, &stack);
7373
}
7474

7575
__declspec(noinline) void _free_dbg(void *ptr, int) { free(ptr); }
@@ -252,7 +252,7 @@ INTERCEPTOR_WINAPI(BOOL, HeapFree, HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) {
252252
CHECK((HEAP_FREE_UNSUPPORTED_FLAGS & dwFlags) != 0 && "unsupported flags");
253253
}
254254
GET_STACK_TRACE_FREE;
255-
asan_free(lpMem, &stack, FROM_MALLOC);
255+
asan_free(lpMem, &stack);
256256
return true;
257257
}
258258

@@ -306,7 +306,7 @@ void *SharedReAlloc(ReAllocFunction reallocFunc, SizeFunction heapSizeFunc,
306306
if (replacement_alloc) {
307307
size_t old_size = heapSizeFunc(hHeap, dwFlags, lpMem);
308308
if (old_size == ((size_t)0) - 1) {
309-
asan_free(replacement_alloc, &stack, FROM_MALLOC);
309+
asan_free(replacement_alloc, &stack);
310310
return nullptr;
311311
}
312312
REAL(memcpy)(replacement_alloc, lpMem, old_size);
@@ -331,7 +331,7 @@ void *SharedReAlloc(ReAllocFunction reallocFunc, SizeFunction heapSizeFunc,
331331
old_usable_size = asan_malloc_usable_size(lpMem, pc, bp);
332332
REAL(memcpy)(replacement_alloc, lpMem,
333333
Min<size_t>(dwBytes, old_usable_size));
334-
asan_free(lpMem, &stack, FROM_MALLOC);
334+
asan_free(lpMem, &stack);
335335
}
336336
return replacement_alloc;
337337
}
@@ -429,7 +429,7 @@ INTERCEPTOR_WINAPI(BOOL, RtlFreeHeap, HANDLE HeapHandle, DWORD Flags,
429429
return REAL(RtlFreeHeap)(HeapHandle, Flags, BaseAddress);
430430
}
431431
GET_STACK_TRACE_FREE;
432-
asan_free(BaseAddress, &stack, FROM_MALLOC);
432+
asan_free(BaseAddress, &stack);
433433
return true;
434434
}
435435

compiler-rt/lib/asan/asan_new_delete.cpp

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,42 +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 \
64-
GET_STACK_TRACE_MALLOC; \
65-
void *res = asan_memalign(0, size, &stack, FROM_NEW); \
66-
if (UNLIKELY(!res)) \
67-
ReportOutOfMemory(size, &stack); \
63+
#define OPERATOR_NEW_BODY \
64+
GET_STACK_TRACE_MALLOC; \
65+
void *res = asan_new(size, &stack); \
66+
if (UNLIKELY(!res)) \
67+
ReportOutOfMemory(size, &stack); \
6868
return res
6969
#define OPERATOR_NEW_BODY_NOTHROW \
7070
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); \
71+
return asan_new(size, &stack)
72+
#define OPERATOR_NEW_BODY_ARRAY \
73+
GET_STACK_TRACE_MALLOC; \
74+
void *res = asan_new_array(size, &stack); \
75+
if (UNLIKELY(!res)) \
76+
ReportOutOfMemory(size, &stack); \
7777
return res
7878
#define OPERATOR_NEW_BODY_ARRAY_NOTHROW \
7979
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); \
80+
return asan_new_array(size, &stack)
81+
#define OPERATOR_NEW_BODY_ALIGN \
82+
GET_STACK_TRACE_MALLOC; \
83+
void *res = asan_new_aligned((uptr)align, size, &stack); \
84+
if (UNLIKELY(!res)) \
85+
ReportOutOfMemory(size, &stack); \
8686
return res
8787
#define OPERATOR_NEW_BODY_ALIGN_NOTHROW \
8888
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); \
89+
return asan_new_aligned((uptr)align, size, &stack)
90+
#define OPERATOR_NEW_BODY_ALIGN_ARRAY \
91+
GET_STACK_TRACE_MALLOC; \
92+
void *res = asan_new_array_aligned((uptr)align, size, &stack); \
93+
if (UNLIKELY(!res)) \
94+
ReportOutOfMemory(size, &stack); \
9595
return res
9696
#define OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW \
9797
GET_STACK_TRACE_MALLOC; \
98-
return asan_memalign((uptr)align, size, &stack, FROM_NEW_BR)
98+
return asan_new_array_aligned((uptr)align, size, &stack)
9999

100100
// On OS X it's not enough to just provide our own 'operator new' and
101101
// 'operator delete' implementations, because they're going to be in the
@@ -149,28 +149,28 @@ INTERCEPTOR(void *, _ZnamRKSt9nothrow_t, size_t size, std::nothrow_t const&) {
149149

150150
#define OPERATOR_DELETE_BODY \
151151
GET_STACK_TRACE_FREE; \
152-
asan_delete(ptr, 0, 0, &stack, FROM_NEW)
152+
asan_delete(ptr, &stack)
153153
#define OPERATOR_DELETE_BODY_ARRAY \
154154
GET_STACK_TRACE_FREE; \
155-
asan_delete(ptr, 0, 0, &stack, FROM_NEW_BR)
155+
asan_delete_array(ptr, &stack)
156156
#define OPERATOR_DELETE_BODY_ALIGN \
157157
GET_STACK_TRACE_FREE; \
158-
asan_delete(ptr, 0, static_cast<uptr>(align), &stack, FROM_NEW)
158+
asan_delete_aligned(ptr, static_cast<uptr>(align), &stack)
159159
#define OPERATOR_DELETE_BODY_ALIGN_ARRAY \
160160
GET_STACK_TRACE_FREE; \
161-
asan_delete(ptr, 0, static_cast<uptr>(align), &stack, FROM_NEW_BR)
161+
asan_delete_array_aligned(ptr, static_cast<uptr>(align), &stack)
162162
#define OPERATOR_DELETE_BODY_SIZE \
163163
GET_STACK_TRACE_FREE; \
164-
asan_delete(ptr, size, 0, &stack, FROM_NEW)
164+
asan_delete_sized(ptr, size, &stack)
165165
#define OPERATOR_DELETE_BODY_SIZE_ARRAY \
166166
GET_STACK_TRACE_FREE; \
167-
asan_delete(ptr, size, 0, &stack, FROM_NEW_BR)
167+
asan_delete_array_sized(ptr, size, &stack)
168168
#define OPERATOR_DELETE_BODY_SIZE_ALIGN \
169169
GET_STACK_TRACE_FREE; \
170-
asan_delete(ptr, size, static_cast<uptr>(align), &stack, FROM_NEW)
170+
asan_delete_sized_aligned(ptr, size, static_cast<uptr>(align), &stack)
171171
#define OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY \
172172
GET_STACK_TRACE_FREE; \
173-
asan_delete(ptr, size, static_cast<uptr>(align), &stack, FROM_NEW_BR)
173+
asan_delete_array_sized_aligned(ptr, size, static_cast<uptr>(align), &stack)
174174

175175
#if !SANITIZER_APPLE
176176
CXX_OPERATOR_ATTRIBUTE

0 commit comments

Comments
 (0)