Path: blob/main/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_new_delete.cpp
35266 views
//===-- tsan_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 ThreadSanitizer (TSan), a race detector.9//10// Interceptors for operators new and delete.11//===----------------------------------------------------------------------===//12#include "interception/interception.h"13#include "sanitizer_common/sanitizer_allocator.h"14#include "sanitizer_common/sanitizer_allocator_report.h"15#include "sanitizer_common/sanitizer_internal_defs.h"16#include "tsan_interceptors.h"17#include "tsan_rtl.h"1819using namespace __tsan;2021namespace std {22struct nothrow_t {};23enum class align_val_t: __sanitizer::uptr {};24} // namespace std2526DECLARE_REAL(void *, malloc, uptr size)27DECLARE_REAL(void, free, void *ptr)2829// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.30#define OPERATOR_NEW_BODY(mangled_name, nothrow) \31if (in_symbolizer()) \32return InternalAlloc(size); \33void *p = 0; \34{ \35SCOPED_INTERCEPTOR_RAW(mangled_name, size); \36p = user_alloc(thr, pc, size); \37if (!nothrow && UNLIKELY(!p)) { \38GET_STACK_TRACE_FATAL(thr, pc); \39ReportOutOfMemory(size, &stack); \40} \41} \42invoke_malloc_hook(p, size); \43return p;4445#define OPERATOR_NEW_BODY_ALIGN(mangled_name, nothrow) \46if (in_symbolizer()) \47return InternalAlloc(size, nullptr, (uptr)align); \48void *p = 0; \49{ \50SCOPED_INTERCEPTOR_RAW(mangled_name, size); \51p = user_memalign(thr, pc, (uptr)align, size); \52if (!nothrow && UNLIKELY(!p)) { \53GET_STACK_TRACE_FATAL(thr, pc); \54ReportOutOfMemory(size, &stack); \55} \56} \57invoke_malloc_hook(p, size); \58return p;5960SANITIZER_INTERFACE_ATTRIBUTE61void *operator new(__sanitizer::uptr size);62void *operator new(__sanitizer::uptr size) {63OPERATOR_NEW_BODY(_Znwm, false /*nothrow*/);64}6566SANITIZER_INTERFACE_ATTRIBUTE67void *operator new[](__sanitizer::uptr size);68void *operator new[](__sanitizer::uptr size) {69OPERATOR_NEW_BODY(_Znam, false /*nothrow*/);70}7172SANITIZER_INTERFACE_ATTRIBUTE73void *operator new(__sanitizer::uptr size, std::nothrow_t const&);74void *operator new(__sanitizer::uptr size, std::nothrow_t const&) {75OPERATOR_NEW_BODY(_ZnwmRKSt9nothrow_t, true /*nothrow*/);76}7778SANITIZER_INTERFACE_ATTRIBUTE79void *operator new[](__sanitizer::uptr size, std::nothrow_t const&);80void *operator new[](__sanitizer::uptr size, std::nothrow_t const&) {81OPERATOR_NEW_BODY(_ZnamRKSt9nothrow_t, true /*nothrow*/);82}8384SANITIZER_INTERFACE_ATTRIBUTE85void *operator new(__sanitizer::uptr size, std::align_val_t align);86void *operator new(__sanitizer::uptr size, std::align_val_t align) {87OPERATOR_NEW_BODY_ALIGN(_ZnwmSt11align_val_t, false /*nothrow*/);88}8990SANITIZER_INTERFACE_ATTRIBUTE91void *operator new[](__sanitizer::uptr size, std::align_val_t align);92void *operator new[](__sanitizer::uptr size, std::align_val_t align) {93OPERATOR_NEW_BODY_ALIGN(_ZnamSt11align_val_t, false /*nothrow*/);94}9596SANITIZER_INTERFACE_ATTRIBUTE97void *operator new(__sanitizer::uptr size, std::align_val_t align,98std::nothrow_t const&);99void *operator new(__sanitizer::uptr size, std::align_val_t align,100std::nothrow_t const&) {101OPERATOR_NEW_BODY_ALIGN(_ZnwmSt11align_val_tRKSt9nothrow_t,102true /*nothrow*/);103}104105SANITIZER_INTERFACE_ATTRIBUTE106void *operator new[](__sanitizer::uptr size, std::align_val_t align,107std::nothrow_t const&);108void *operator new[](__sanitizer::uptr size, std::align_val_t align,109std::nothrow_t const&) {110OPERATOR_NEW_BODY_ALIGN(_ZnamSt11align_val_tRKSt9nothrow_t,111true /*nothrow*/);112}113114#define OPERATOR_DELETE_BODY(mangled_name) \115if (ptr == 0) return; \116if (in_symbolizer()) \117return InternalFree(ptr); \118invoke_free_hook(ptr); \119SCOPED_INTERCEPTOR_RAW(mangled_name, ptr); \120user_free(thr, pc, ptr);121122SANITIZER_INTERFACE_ATTRIBUTE123void operator delete(void *ptr) NOEXCEPT;124void operator delete(void *ptr) NOEXCEPT {125OPERATOR_DELETE_BODY(_ZdlPv);126}127128SANITIZER_INTERFACE_ATTRIBUTE129void operator delete[](void *ptr) NOEXCEPT;130void operator delete[](void *ptr) NOEXCEPT {131OPERATOR_DELETE_BODY(_ZdaPv);132}133134SANITIZER_INTERFACE_ATTRIBUTE135void operator delete(void *ptr, std::nothrow_t const&);136void operator delete(void *ptr, std::nothrow_t const&) {137OPERATOR_DELETE_BODY(_ZdlPvRKSt9nothrow_t);138}139140SANITIZER_INTERFACE_ATTRIBUTE141void operator delete[](void *ptr, std::nothrow_t const&);142void operator delete[](void *ptr, std::nothrow_t const&) {143OPERATOR_DELETE_BODY(_ZdaPvRKSt9nothrow_t);144}145146SANITIZER_INTERFACE_ATTRIBUTE147void operator delete(void *ptr, __sanitizer::uptr size) NOEXCEPT;148void operator delete(void *ptr, __sanitizer::uptr size) NOEXCEPT {149OPERATOR_DELETE_BODY(_ZdlPvm);150}151152SANITIZER_INTERFACE_ATTRIBUTE153void operator delete[](void *ptr, __sanitizer::uptr size) NOEXCEPT;154void operator delete[](void *ptr, __sanitizer::uptr size) NOEXCEPT {155OPERATOR_DELETE_BODY(_ZdaPvm);156}157158SANITIZER_INTERFACE_ATTRIBUTE159void operator delete(void *ptr, std::align_val_t align) NOEXCEPT;160void operator delete(void *ptr, std::align_val_t align) NOEXCEPT {161OPERATOR_DELETE_BODY(_ZdlPvSt11align_val_t);162}163164SANITIZER_INTERFACE_ATTRIBUTE165void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT;166void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT {167OPERATOR_DELETE_BODY(_ZdaPvSt11align_val_t);168}169170SANITIZER_INTERFACE_ATTRIBUTE171void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&);172void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&) {173OPERATOR_DELETE_BODY(_ZdlPvSt11align_val_tRKSt9nothrow_t);174}175176SANITIZER_INTERFACE_ATTRIBUTE177void operator delete[](void *ptr, std::align_val_t align,178std::nothrow_t const&);179void operator delete[](void *ptr, std::align_val_t align,180std::nothrow_t const&) {181OPERATOR_DELETE_BODY(_ZdaPvSt11align_val_tRKSt9nothrow_t);182}183184SANITIZER_INTERFACE_ATTRIBUTE185void operator delete(void *ptr, __sanitizer::uptr size,186std::align_val_t align) NOEXCEPT;187void operator delete(void *ptr, __sanitizer::uptr size,188std::align_val_t align) NOEXCEPT {189OPERATOR_DELETE_BODY(_ZdlPvmSt11align_val_t);190}191192SANITIZER_INTERFACE_ATTRIBUTE193void operator delete[](void *ptr, __sanitizer::uptr size,194std::align_val_t align) NOEXCEPT;195void operator delete[](void *ptr, __sanitizer::uptr size,196std::align_val_t align) NOEXCEPT {197OPERATOR_DELETE_BODY(_ZdaPvmSt11align_val_t);198}199200201