Path: blob/main/contrib/llvm-project/compiler-rt/lib/msan/msan_new_delete.cpp
35262 views
//===-- msan_new_delete.cpp -----------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is a part of MemorySanitizer.9//10// Interceptors for operators new and delete.11//===----------------------------------------------------------------------===//1213#include "msan.h"14#include "interception/interception.h"15#include "sanitizer_common/sanitizer_allocator.h"16#include "sanitizer_common/sanitizer_allocator_report.h"1718#if MSAN_REPLACE_OPERATORS_NEW_AND_DELETE1920#include <stddef.h>2122using namespace __msan;2324// Fake std::nothrow_t and std::align_val_t to avoid including <new>.25namespace std {26struct nothrow_t {};27enum class align_val_t: size_t {};28} // namespace std293031// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.32# define OPERATOR_NEW_BODY(nothrow) \33GET_MALLOC_STACK_TRACE; \34void *res = msan_malloc(size, &stack); \35if (!nothrow && UNLIKELY(!res)) { \36GET_FATAL_STACK_TRACE_IF_EMPTY(&stack); \37ReportOutOfMemory(size, &stack); \38} \39return res40# define OPERATOR_NEW_BODY_ALIGN(nothrow) \41GET_MALLOC_STACK_TRACE; \42void *res = msan_memalign((uptr)align, size, &stack); \43if (!nothrow && UNLIKELY(!res)) { \44GET_FATAL_STACK_TRACE_IF_EMPTY(&stack); \45ReportOutOfMemory(size, &stack); \46} \47return res;4849INTERCEPTOR_ATTRIBUTE50void *operator new(size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); }51INTERCEPTOR_ATTRIBUTE52void *operator new[](size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); }53INTERCEPTOR_ATTRIBUTE54void *operator new(size_t size, std::nothrow_t const&) {55OPERATOR_NEW_BODY(true /*nothrow*/);56}57INTERCEPTOR_ATTRIBUTE58void *operator new[](size_t size, std::nothrow_t const&) {59OPERATOR_NEW_BODY(true /*nothrow*/);60}61INTERCEPTOR_ATTRIBUTE62void *operator new(size_t size, std::align_val_t align)63{ OPERATOR_NEW_BODY_ALIGN(false /*nothrow*/); }64INTERCEPTOR_ATTRIBUTE65void *operator new[](size_t size, std::align_val_t align)66{ OPERATOR_NEW_BODY_ALIGN(false /*nothrow*/); }67INTERCEPTOR_ATTRIBUTE68void *operator new(size_t size, std::align_val_t align, std::nothrow_t const&)69{ OPERATOR_NEW_BODY_ALIGN(true /*nothrow*/); }70INTERCEPTOR_ATTRIBUTE71void *operator new[](size_t size, std::align_val_t align, std::nothrow_t const&)72{ OPERATOR_NEW_BODY_ALIGN(true /*nothrow*/); }7374#define OPERATOR_DELETE_BODY \75GET_MALLOC_STACK_TRACE; \76if (ptr) MsanDeallocate(&stack, ptr)7778INTERCEPTOR_ATTRIBUTE79void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }80INTERCEPTOR_ATTRIBUTE81void operator delete[](void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }82INTERCEPTOR_ATTRIBUTE83void operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }84INTERCEPTOR_ATTRIBUTE85void operator delete[](void *ptr, std::nothrow_t const&) {86OPERATOR_DELETE_BODY;87}88INTERCEPTOR_ATTRIBUTE89void operator delete(void *ptr, size_t size) NOEXCEPT { OPERATOR_DELETE_BODY; }90INTERCEPTOR_ATTRIBUTE91void operator delete[](void *ptr, size_t size) NOEXCEPT92{ OPERATOR_DELETE_BODY; }93INTERCEPTOR_ATTRIBUTE94void operator delete(void *ptr, std::align_val_t align) NOEXCEPT95{ OPERATOR_DELETE_BODY; }96INTERCEPTOR_ATTRIBUTE97void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT98{ OPERATOR_DELETE_BODY; }99INTERCEPTOR_ATTRIBUTE100void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&)101{ OPERATOR_DELETE_BODY; }102INTERCEPTOR_ATTRIBUTE103void operator delete[](void *ptr, std::align_val_t align, std::nothrow_t const&)104{ OPERATOR_DELETE_BODY; }105INTERCEPTOR_ATTRIBUTE106void operator delete(void *ptr, size_t size, std::align_val_t align) NOEXCEPT107{ OPERATOR_DELETE_BODY; }108INTERCEPTOR_ATTRIBUTE109void operator delete[](void *ptr, size_t size, std::align_val_t align) NOEXCEPT110{ OPERATOR_DELETE_BODY; }111112113#endif // MSAN_REPLACE_OPERATORS_NEW_AND_DELETE114115116