1351282Sdim//===-- hwasan_new_delete.cpp ---------------------------------------------===// 2351282Sdim// 3351282Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4351282Sdim// See https://llvm.org/LICENSE.txt for license information. 5351282Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6351282Sdim// 7351282Sdim//===----------------------------------------------------------------------===// 8351282Sdim// 9351282Sdim// This file is a part of HWAddressSanitizer. 10351282Sdim// 11351282Sdim// Interceptors for operators new and delete. 12351282Sdim//===----------------------------------------------------------------------===// 13351282Sdim 14351282Sdim#include "hwasan.h" 15351282Sdim#include "interception/interception.h" 16351282Sdim#include "sanitizer_common/sanitizer_allocator.h" 17351282Sdim#include "sanitizer_common/sanitizer_allocator_report.h" 18351282Sdim 19351282Sdim#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE 20351282Sdim 21351282Sdim#include <stddef.h> 22351282Sdim 23360784Sdimusing namespace __hwasan; 24351282Sdim 25351282Sdim// Fake std::nothrow_t to avoid including <new>. 26351282Sdimnamespace std { 27351282Sdim struct nothrow_t {}; 28351282Sdim} // namespace std 29351282Sdim 30351282Sdim 31351282Sdim// TODO(alekseys): throw std::bad_alloc instead of dying on OOM. 32351282Sdim#define OPERATOR_NEW_BODY(nothrow) \ 33351282Sdim GET_MALLOC_STACK_TRACE; \ 34351282Sdim void *res = hwasan_malloc(size, &stack);\ 35351282Sdim if (!nothrow && UNLIKELY(!res)) ReportOutOfMemory(size, &stack);\ 36351282Sdim return res 37351282Sdim 38351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 39351282Sdimvoid *operator new(size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); } 40351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 41351282Sdimvoid *operator new[](size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); } 42351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 43351282Sdimvoid *operator new(size_t size, std::nothrow_t const&) { 44351282Sdim OPERATOR_NEW_BODY(true /*nothrow*/); 45351282Sdim} 46351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 47351282Sdimvoid *operator new[](size_t size, std::nothrow_t const&) { 48351282Sdim OPERATOR_NEW_BODY(true /*nothrow*/); 49351282Sdim} 50351282Sdim 51351282Sdim#define OPERATOR_DELETE_BODY \ 52351282Sdim GET_MALLOC_STACK_TRACE; \ 53351282Sdim if (ptr) hwasan_free(ptr, &stack) 54351282Sdim 55351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 56351282Sdimvoid operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; } 57351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 58351282Sdimvoid operator delete[](void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; } 59351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 60351282Sdimvoid operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; } 61351282SdimINTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 62351282Sdimvoid operator delete[](void *ptr, std::nothrow_t const&) { 63351282Sdim OPERATOR_DELETE_BODY; 64351282Sdim} 65351282Sdim 66351282Sdim#endif // HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE 67