asan_new_delete.cc revision ed4c034955e33b999b37f735feec8a7c315a6e3d
1//===-- asan_interceptors.cc ----------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of AddressSanitizer, an address sanity checker. 11// 12// Interceptors for operators new and delete. 13//===----------------------------------------------------------------------===// 14 15#include "asan_allocator.h" 16#include "asan_internal.h" 17#include "asan_stack.h" 18 19#include <stddef.h> 20 21namespace __asan { 22// This function is a no-op. We need it to make sure that object file 23// with our replacements will actually be loaded from static ASan 24// run-time library at link-time. 25void ReplaceOperatorsNewAndDelete() { } 26} 27 28using namespace __asan; // NOLINT 29 30// On Android new() goes through malloc interceptors. 31// See also https://code.google.com/p/address-sanitizer/issues/detail?id=131. 32#if !ASAN_ANDROID 33 34// Fake std::nothrow_t to avoid including <new>. 35namespace std { 36struct nothrow_t {}; 37} // namespace std 38 39#define OPERATOR_NEW_BODY(type) \ 40 GET_STACK_TRACE_MALLOC;\ 41 return asan_memalign(0, size, &stack, type); 42 43INTERCEPTOR_ATTRIBUTE 44void *operator new(size_t size) { OPERATOR_NEW_BODY(FROM_NEW); } 45INTERCEPTOR_ATTRIBUTE 46void *operator new[](size_t size) { OPERATOR_NEW_BODY(FROM_NEW_BR); } 47INTERCEPTOR_ATTRIBUTE 48void *operator new(size_t size, std::nothrow_t const&) 49{ OPERATOR_NEW_BODY(FROM_NEW); } 50INTERCEPTOR_ATTRIBUTE 51void *operator new[](size_t size, std::nothrow_t const&) 52{ OPERATOR_NEW_BODY(FROM_NEW_BR); } 53 54#define OPERATOR_DELETE_BODY(type) \ 55 GET_STACK_TRACE_FREE;\ 56 asan_free(ptr, &stack, type); 57 58INTERCEPTOR_ATTRIBUTE 59void operator delete(void *ptr) { OPERATOR_DELETE_BODY(FROM_NEW); } 60INTERCEPTOR_ATTRIBUTE 61void operator delete[](void *ptr) { OPERATOR_DELETE_BODY(FROM_NEW_BR); } 62INTERCEPTOR_ATTRIBUTE 63void operator delete(void *ptr, std::nothrow_t const&) 64{ OPERATOR_DELETE_BODY(FROM_NEW); } 65INTERCEPTOR_ATTRIBUTE 66void operator delete[](void *ptr, std::nothrow_t const&) 67{ OPERATOR_DELETE_BODY(FROM_NEW_BR); } 68 69#endif 70