xref: /netbsd-src/external/gpl3/gcc.old/dist/libsanitizer/asan/asan_new_delete.cc (revision a24efa7dea9f1f56c3bdb15a927d3516792ace1c)
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 
19 namespace __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.
23 void ReplaceOperatorsNewAndDelete() { }
24 }
25 
26 using 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>.
33 namespace std {
34 struct 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 
41 INTERCEPTOR_ATTRIBUTE
42 void *operator new(size_t size) { OPERATOR_NEW_BODY(FROM_NEW); }
43 INTERCEPTOR_ATTRIBUTE
44 void *operator new[](size_t size) { OPERATOR_NEW_BODY(FROM_NEW_BR); }
45 INTERCEPTOR_ATTRIBUTE
46 void *operator new(size_t size, std::nothrow_t const&)
47 { OPERATOR_NEW_BODY(FROM_NEW); }
48 INTERCEPTOR_ATTRIBUTE
49 void *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 
56 INTERCEPTOR_ATTRIBUTE
57 void operator delete(void *ptr) { OPERATOR_DELETE_BODY(FROM_NEW); }
58 INTERCEPTOR_ATTRIBUTE
59 void operator delete[](void *ptr) { OPERATOR_DELETE_BODY(FROM_NEW_BR); }
60 INTERCEPTOR_ATTRIBUTE
61 void operator delete(void *ptr, std::nothrow_t const&)
62 { OPERATOR_DELETE_BODY(FROM_NEW); }
63 INTERCEPTOR_ATTRIBUTE
64 void operator delete[](void *ptr, std::nothrow_t const&)
65 { OPERATOR_DELETE_BODY(FROM_NEW_BR); }
66 
67 #endif
68