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