1*7c3d14c8STreehugger Robot //===-- asan_malloc_mac.cc ------------------------------------------------===// 2*7c3d14c8STreehugger Robot // 3*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure 4*7c3d14c8STreehugger Robot // 5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source 6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details. 7*7c3d14c8STreehugger Robot // 8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 9*7c3d14c8STreehugger Robot // 10*7c3d14c8STreehugger Robot // This file is a part of AddressSanitizer, an address sanity checker. 11*7c3d14c8STreehugger Robot // 12*7c3d14c8STreehugger Robot // Mac-specific malloc interception. 13*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 14*7c3d14c8STreehugger Robot 15*7c3d14c8STreehugger Robot #include "sanitizer_common/sanitizer_platform.h" 16*7c3d14c8STreehugger Robot #if SANITIZER_MAC 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot #include "asan_interceptors.h" 19*7c3d14c8STreehugger Robot #include "asan_report.h" 20*7c3d14c8STreehugger Robot #include "asan_stack.h" 21*7c3d14c8STreehugger Robot #include "asan_stats.h" 22*7c3d14c8STreehugger Robot 23*7c3d14c8STreehugger Robot using namespace __asan; 24*7c3d14c8STreehugger Robot #define COMMON_MALLOC_ZONE_NAME "asan" 25*7c3d14c8STreehugger Robot #define COMMON_MALLOC_ENTER() ENSURE_ASAN_INITED() 26*7c3d14c8STreehugger Robot #define COMMON_MALLOC_SANITIZER_INITIALIZED asan_inited 27*7c3d14c8STreehugger Robot #define COMMON_MALLOC_FORCE_LOCK() asan_mz_force_lock() 28*7c3d14c8STreehugger Robot #define COMMON_MALLOC_FORCE_UNLOCK() asan_mz_force_unlock() 29*7c3d14c8STreehugger Robot #define COMMON_MALLOC_MEMALIGN(alignment, size) \ 30*7c3d14c8STreehugger Robot GET_STACK_TRACE_MALLOC; \ 31*7c3d14c8STreehugger Robot void *p = asan_memalign(alignment, size, &stack, FROM_MALLOC) 32*7c3d14c8STreehugger Robot #define COMMON_MALLOC_MALLOC(size) \ 33*7c3d14c8STreehugger Robot GET_STACK_TRACE_MALLOC; \ 34*7c3d14c8STreehugger Robot void *p = asan_malloc(size, &stack) 35*7c3d14c8STreehugger Robot #define COMMON_MALLOC_REALLOC(ptr, size) \ 36*7c3d14c8STreehugger Robot GET_STACK_TRACE_MALLOC; \ 37*7c3d14c8STreehugger Robot void *p = asan_realloc(ptr, size, &stack); 38*7c3d14c8STreehugger Robot #define COMMON_MALLOC_CALLOC(count, size) \ 39*7c3d14c8STreehugger Robot GET_STACK_TRACE_MALLOC; \ 40*7c3d14c8STreehugger Robot void *p = asan_calloc(count, size, &stack); 41*7c3d14c8STreehugger Robot #define COMMON_MALLOC_VALLOC(size) \ 42*7c3d14c8STreehugger Robot GET_STACK_TRACE_MALLOC; \ 43*7c3d14c8STreehugger Robot void *p = asan_memalign(GetPageSizeCached(), size, &stack, FROM_MALLOC); 44*7c3d14c8STreehugger Robot #define COMMON_MALLOC_FREE(ptr) \ 45*7c3d14c8STreehugger Robot GET_STACK_TRACE_FREE; \ 46*7c3d14c8STreehugger Robot asan_free(ptr, &stack, FROM_MALLOC); 47*7c3d14c8STreehugger Robot #define COMMON_MALLOC_SIZE(ptr) \ 48*7c3d14c8STreehugger Robot uptr size = asan_mz_size(ptr); 49*7c3d14c8STreehugger Robot #define COMMON_MALLOC_FILL_STATS(zone, stats) \ 50*7c3d14c8STreehugger Robot AsanMallocStats malloc_stats; \ 51*7c3d14c8STreehugger Robot FillMallocStatistics(&malloc_stats); \ 52*7c3d14c8STreehugger Robot CHECK(sizeof(malloc_statistics_t) == sizeof(AsanMallocStats)); \ 53*7c3d14c8STreehugger Robot internal_memcpy(stats, &malloc_stats, sizeof(malloc_statistics_t)); 54*7c3d14c8STreehugger Robot #define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \ 55*7c3d14c8STreehugger Robot GET_STACK_TRACE_FREE; \ 56*7c3d14c8STreehugger Robot ReportMacMzReallocUnknown((uptr)ptr, (uptr)zone_ptr, zone_name, &stack); 57*7c3d14c8STreehugger Robot #define COMMON_MALLOC_NAMESPACE __asan 58*7c3d14c8STreehugger Robot 59*7c3d14c8STreehugger Robot #include "sanitizer_common/sanitizer_malloc_mac.inc" 60*7c3d14c8STreehugger Robot 61*7c3d14c8STreehugger Robot #endif 62