]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- msan_new_delete.cc ------------------------------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // This file is a part of MemorySanitizer. | |
11 | // | |
12 | // Interceptors for operators new and delete. | |
13 | //===----------------------------------------------------------------------===// | |
14 | ||
15 | #include "msan.h" | |
92a42be0 | 16 | #include "interception/interception.h" |
1a4d82fc JJ |
17 | |
18 | #if MSAN_REPLACE_OPERATORS_NEW_AND_DELETE | |
19 | ||
20 | #include <stddef.h> | |
21 | ||
1a4d82fc JJ |
22 | using namespace __msan; // NOLINT |
23 | ||
24 | // Fake std::nothrow_t to avoid including <new>. | |
25 | namespace std { | |
26 | struct nothrow_t {}; | |
27 | } // namespace std | |
28 | ||
29 | ||
30 | #define OPERATOR_NEW_BODY \ | |
31 | GET_MALLOC_STACK_TRACE; \ | |
32 | return MsanReallocate(&stack, 0, size, sizeof(u64), false) | |
33 | ||
34 | INTERCEPTOR_ATTRIBUTE | |
35 | void *operator new(size_t size) { OPERATOR_NEW_BODY; } | |
36 | INTERCEPTOR_ATTRIBUTE | |
37 | void *operator new[](size_t size) { OPERATOR_NEW_BODY; } | |
38 | INTERCEPTOR_ATTRIBUTE | |
39 | void *operator new(size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; } | |
40 | INTERCEPTOR_ATTRIBUTE | |
41 | void *operator new[](size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; } | |
42 | ||
43 | #define OPERATOR_DELETE_BODY \ | |
44 | GET_MALLOC_STACK_TRACE; \ | |
45 | if (ptr) MsanDeallocate(&stack, ptr) | |
46 | ||
47 | INTERCEPTOR_ATTRIBUTE | |
92a42be0 | 48 | void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; } |
1a4d82fc | 49 | INTERCEPTOR_ATTRIBUTE |
92a42be0 | 50 | void operator delete[](void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; } |
1a4d82fc JJ |
51 | INTERCEPTOR_ATTRIBUTE |
52 | void operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; } | |
53 | INTERCEPTOR_ATTRIBUTE | |
54 | void operator delete[](void *ptr, std::nothrow_t const&) { | |
55 | OPERATOR_DELETE_BODY; | |
56 | } | |
57 | ||
58 | #endif // MSAN_REPLACE_OPERATORS_NEW_AND_DELETE |