asan_new_delete.cc revision dbe60352ef7240327f15f813140c9726854f6b85
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com//===-- asan_interceptors.cc ----------------------------------------------===// 2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// 3cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// The LLVM Compiler Infrastructure 4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// 5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// This file is distributed under the University of Illinois Open Source 6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// License. See LICENSE.TXT for details. 7cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// 8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com//===----------------------------------------------------------------------===// 9cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com// 108cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// This file is a part of AddressSanitizer, an address sanity checker. 118cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// 128cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// Interceptors for operators new and delete. 138cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com//===----------------------------------------------------------------------===// 148cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 158cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "asan_allocator.h" 168cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "asan_internal.h" 178cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "asan_stack.h" 188cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 198cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include <stddef.h> 208cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include <new> 218cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 228cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comnamespace __asan { 238cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// This function is a no-op. We need it to make sure that object file 248cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// with our replacements will actually be loaded from static ASan 258cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// run-time library at link-time. 268cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid ReplaceOperatorsNewAndDelete() { } 278cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com} 288cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 298cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comusing namespace __asan; // NOLINT 308cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 318cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com// On Android new() goes through malloc interceptors. 328cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#if !ASAN_ANDROID 338cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 348cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#define OPERATOR_NEW_BODY \ 358cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com GET_STACK_TRACE_HERE_FOR_MALLOC;\ 368cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com return asan_memalign(0, size, &stack); 378cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 388cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 398cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid *operator new(size_t size) throw(std::bad_alloc) { OPERATOR_NEW_BODY; } 408cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 418cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid *operator new[](size_t size) throw(std::bad_alloc) { OPERATOR_NEW_BODY; } 428cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 438cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid *operator new(size_t size, std::nothrow_t const&) throw() 448cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{ OPERATOR_NEW_BODY; } 458cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 468cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid *operator new[](size_t size, std::nothrow_t const&) throw() 478cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{ OPERATOR_NEW_BODY; } 488cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 498cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#define OPERATOR_DELETE_BODY \ 508cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com GET_STACK_TRACE_HERE_FOR_FREE(ptr);\ 518cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com asan_free(ptr, &stack); 528cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 538cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 548cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid operator delete(void *ptr) throw() { OPERATOR_DELETE_BODY; } 558cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 568cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid operator delete[](void *ptr) throw() { OPERATOR_DELETE_BODY; } 578cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 588cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid operator delete(void *ptr, std::nothrow_t const&) throw() 598cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{ OPERATOR_DELETE_BODY; } 608cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comINTERCEPTOR_ATTRIBUTE 618cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.comvoid operator delete[](void *ptr, std::nothrow_t const&) throw() 628cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com{ OPERATOR_DELETE_BODY; } 638cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com 648cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#endif 658cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com