123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- //===-- asan_malloc_mac.cpp -----------------------------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is a part of AddressSanitizer, an address sanity checker.
- //
- // Mac-specific malloc interception.
- //===----------------------------------------------------------------------===//
- #include "sanitizer_common/sanitizer_platform.h"
- #if SANITIZER_MAC
- #include "asan_interceptors.h"
- #include "asan_report.h"
- #include "asan_stack.h"
- #include "asan_stats.h"
- #include "lsan/lsan_common.h"
- using namespace __asan;
- #define COMMON_MALLOC_ZONE_NAME "asan"
- #define COMMON_MALLOC_ENTER() ENSURE_ASAN_INITED()
- #define COMMON_MALLOC_SANITIZER_INITIALIZED asan_inited
- #define COMMON_MALLOC_FORCE_LOCK() asan_mz_force_lock()
- #define COMMON_MALLOC_FORCE_UNLOCK() asan_mz_force_unlock()
- #define COMMON_MALLOC_MEMALIGN(alignment, size) \
- GET_STACK_TRACE_MALLOC; \
- void *p = asan_memalign(alignment, size, &stack, FROM_MALLOC)
- #define COMMON_MALLOC_MALLOC(size) \
- GET_STACK_TRACE_MALLOC; \
- void *p = asan_malloc(size, &stack)
- #define COMMON_MALLOC_REALLOC(ptr, size) \
- GET_STACK_TRACE_MALLOC; \
- void *p = asan_realloc(ptr, size, &stack);
- #define COMMON_MALLOC_CALLOC(count, size) \
- GET_STACK_TRACE_MALLOC; \
- void *p = asan_calloc(count, size, &stack);
- #define COMMON_MALLOC_POSIX_MEMALIGN(memptr, alignment, size) \
- GET_STACK_TRACE_MALLOC; \
- int res = asan_posix_memalign(memptr, alignment, size, &stack);
- #define COMMON_MALLOC_VALLOC(size) \
- GET_STACK_TRACE_MALLOC; \
- void *p = asan_memalign(GetPageSizeCached(), size, &stack, FROM_MALLOC);
- #define COMMON_MALLOC_FREE(ptr) \
- GET_STACK_TRACE_FREE; \
- asan_free(ptr, &stack, FROM_MALLOC);
- #define COMMON_MALLOC_SIZE(ptr) \
- uptr size = asan_mz_size(ptr);
- #define COMMON_MALLOC_FILL_STATS(zone, stats) \
- AsanMallocStats malloc_stats; \
- FillMallocStatistics(&malloc_stats); \
- CHECK(sizeof(malloc_statistics_t) == sizeof(AsanMallocStats)); \
- internal_memcpy(stats, &malloc_stats, sizeof(malloc_statistics_t));
- #define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \
- GET_STACK_TRACE_FREE; \
- ReportMacMzReallocUnknown((uptr)ptr, (uptr)zone_ptr, zone_name, &stack);
- #define COMMON_MALLOC_NAMESPACE __asan
- #define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 0
- #define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 1
- #include "sanitizer_common/sanitizer_malloc_mac.inc"
- namespace COMMON_MALLOC_NAMESPACE {
- bool HandleDlopenInit() {
- static_assert(SANITIZER_SUPPORTS_INIT_FOR_DLOPEN,
- "Expected SANITIZER_SUPPORTS_INIT_FOR_DLOPEN to be true");
- // We have no reliable way of knowing how we are being loaded
- // so make it a requirement on Apple platforms to set this environment
- // variable to indicate that we want to perform initialization via
- // dlopen().
- auto init_str = GetEnv("APPLE_ASAN_INIT_FOR_DLOPEN");
- if (!init_str)
- return false;
- if (internal_strncmp(init_str, "1", 1) != 0)
- return false;
- // When we are loaded via `dlopen()` path we still initialize the malloc zone
- // so Symbolication clients (e.g. `leaks`) that load the ASan allocator can
- // find an initialized malloc zone.
- InitMallocZoneFields();
- return true;
- }
- } // namespace COMMON_MALLOC_NAMESPACE
- namespace {
- void mi_extra_init(sanitizer_malloc_introspection_t *mi) {
- uptr last_byte_plus_one = 0;
- mi->allocator_ptr = 0;
- // Range is [begin_ptr, end_ptr)
- __lsan::GetAllocatorGlobalRange(&(mi->allocator_ptr), &last_byte_plus_one);
- CHECK_NE(mi->allocator_ptr, 0);
- CHECK_GT(last_byte_plus_one, mi->allocator_ptr);
- mi->allocator_size = last_byte_plus_one - (mi->allocator_ptr);
- CHECK_GT(mi->allocator_size, 0);
- }
- } // namespace
- #endif
|