2013-02-21 Richard Biener <rguenther@suse.de>
[official-gcc.git] / libsanitizer / asan / asan_new_delete.cc
blobfd47eee42058e79bb33a672d3b5daac7f9b9342b
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 //===----------------------------------------------------------------------===//
13 #include "asan_allocator.h"
14 #include "asan_internal.h"
15 #include "asan_stack.h"
17 #include <stddef.h>
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() { }
26 using namespace __asan; // NOLINT
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
32 // Fake std::nothrow_t to avoid including <new>.
33 namespace std {
34 struct nothrow_t {};
35 } // namespace std
37 #define OPERATOR_NEW_BODY(type) \
38 GET_STACK_TRACE_MALLOC;\
39 return asan_memalign(0, size, &stack, type);
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); }
52 #define OPERATOR_DELETE_BODY(type) \
53 GET_STACK_TRACE_FREE;\
54 asan_free(ptr, &stack, type);
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); }
67 #endif