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