msan_new_delete.cc revision effdc7e483708cfa4dc597c21f246c5dbc09daa0
178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===-- msan_new_delete.cc ------------------------------------------------===//
278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//                     The LLVM Compiler Infrastructure
478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is distributed under the University of Illinois Open Source
678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// License. See LICENSE.TXT for details.
778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===//
978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
1078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is a part of MemorySanitizer.
1178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//
1278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Interceptors for operators new and delete.
1378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===//
1478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
1578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan.h"
1678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
17e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov#if MSAN_REPLACE_OPERATORS_NEW_AND_DELETE
18e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov
1978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <stddef.h>
2078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
2178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan {
2278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This function is a no-op. We need it to make sure that object file
2378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// with our replacements will actually be loaded from static MSan
2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// run-time library at link-time.
2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid ReplaceOperatorsNewAndDelete() { }
2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan;  // NOLINT
2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Fake std::nothrow_t to avoid including <new>.
3178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace std {
3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  struct nothrow_t {};
3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}  // namespace std
3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define OPERATOR_NEW_BODY \
3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  GET_MALLOC_STACK_TRACE; \
3878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return MsanReallocate(&stack, 0, size, sizeof(u64), false)
3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
4078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new(size_t size) { OPERATOR_NEW_BODY; }
4178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new[](size_t size) { OPERATOR_NEW_BODY; }
4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new(size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new[](size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
4578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define OPERATOR_DELETE_BODY \
46effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov  GET_MALLOC_STACK_TRACE; \
47effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov  if (ptr) MsanDeallocate(&stack, ptr)
4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
4978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid operator delete(void *ptr) { OPERATOR_DELETE_BODY; }
5078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid operator delete[](void *ptr) { OPERATOR_DELETE_BODY; }
5178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }
5278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid operator delete[](void *ptr, std::nothrow_t const&) {
5378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  OPERATOR_DELETE_BODY;
5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
55e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov
56e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov#endif // MSAN_REPLACE_OPERATORS_NEW_AND_DELETE
57