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