]> git.ipfire.org Git - thirdparty/gcc.git/blame - libsanitizer/asan/asan_new_delete.cc
[libsanitizer] merge from upstream r168514
[thirdparty/gcc.git] / libsanitizer / asan / asan_new_delete.cc
CommitLineData
f35db108
WM
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>
f35db108
WM
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
e297eb60
KS
28// On Android new() goes through malloc interceptors.
29#if !ASAN_ANDROID
30
31// Fake std::nothrow_t to avoid including <new>.
32namespace std {
33struct nothrow_t {};
34} // namespace std
35
f35db108
WM
36#define OPERATOR_NEW_BODY \
37 GET_STACK_TRACE_HERE_FOR_MALLOC;\
38 return asan_memalign(0, size, &stack);
39
e297eb60 40INTERCEPTOR_ATTRIBUTE
f35db108 41void *operator new(size_t size) { OPERATOR_NEW_BODY; }
e297eb60 42INTERCEPTOR_ATTRIBUTE
f35db108 43void *operator new[](size_t size) { OPERATOR_NEW_BODY; }
e297eb60
KS
44INTERCEPTOR_ATTRIBUTE
45void *operator new(size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
46INTERCEPTOR_ATTRIBUTE
47void *operator new[](size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
f35db108
WM
48
49#define OPERATOR_DELETE_BODY \
50 GET_STACK_TRACE_HERE_FOR_FREE(ptr);\
51 asan_free(ptr, &stack);
52
e297eb60
KS
53INTERCEPTOR_ATTRIBUTE
54void operator delete(void *ptr) { OPERATOR_DELETE_BODY; }
55INTERCEPTOR_ATTRIBUTE
56void operator delete[](void *ptr) { OPERATOR_DELETE_BODY; }
57INTERCEPTOR_ATTRIBUTE
58void operator delete(void *ptr, std::nothrow_t const&)
f35db108 59{ OPERATOR_DELETE_BODY; }
e297eb60
KS
60INTERCEPTOR_ATTRIBUTE
61void operator delete[](void *ptr, std::nothrow_t const&)
f35db108 62{ OPERATOR_DELETE_BODY; }
e297eb60
KS
63
64#endif