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