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"
166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include "interception/interception.h"
1778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
18e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov#if MSAN_REPLACE_OPERATORS_NEW_AND_DELETE
19e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov
2078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include <stddef.h>
2178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
2278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan;  // NOLINT
2378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Fake std::nothrow_t to avoid including <new>.
2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace std {
2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  struct nothrow_t {};
2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}  // namespace std
2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
3078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define OPERATOR_NEW_BODY \
3178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  GET_MALLOC_STACK_TRACE; \
3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  return MsanReallocate(&stack, 0, size, sizeof(u64), false)
3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new(size_t size) { OPERATOR_NEW_BODY; }
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new[](size_t size) { OPERATOR_NEW_BODY; }
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new(size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
4178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *operator new[](size_t size, std::nothrow_t const&) { OPERATOR_NEW_BODY; }
4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#define OPERATOR_DELETE_BODY \
44effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov  GET_MALLOC_STACK_TRACE; \
45effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov  if (ptr) MsanDeallocate(&stack, ptr)
4678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarvoid operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarvoid operator delete[](void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
5278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }
532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesINTERCEPTOR_ATTRIBUTE
5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid operator delete[](void *ptr, std::nothrow_t const&) {
5578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov  OPERATOR_DELETE_BODY;
5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}
57e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov
58e865045ad1c5d8191097cda4bdd2e4cd634d1fa2Evgeniy Stepanov#endif // MSAN_REPLACE_OPERATORS_NEW_AND_DELETE
59