Path: blob/main/contrib/llvm-project/compiler-rt/lib/hwasan/hwasan_new_delete.cpp
35235 views
//===-- hwasan_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 HWAddressSanitizer.9//10// Interceptors for operators new and delete.11//===----------------------------------------------------------------------===//1213#include "hwasan.h"14#include "interception/interception.h"15#include "sanitizer_common/sanitizer_allocator.h"16#include "sanitizer_common/sanitizer_allocator_report.h"1718#include <stddef.h>19#include <stdlib.h>2021#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE2223// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.24# define OPERATOR_NEW_BODY(nothrow) \25GET_MALLOC_STACK_TRACE; \26void *res = hwasan_malloc(size, &stack); \27if (!nothrow && UNLIKELY(!res)) \28ReportOutOfMemory(size, &stack); \29return res30# define OPERATOR_NEW_ALIGN_BODY(nothrow) \31GET_MALLOC_STACK_TRACE; \32void *res = hwasan_memalign(static_cast<uptr>(align), size, &stack); \33if (!nothrow && UNLIKELY(!res)) \34ReportOutOfMemory(size, &stack); \35return res3637# define OPERATOR_DELETE_BODY \38GET_MALLOC_STACK_TRACE; \39if (ptr) \40hwasan_free(ptr, &stack)4142#elif defined(__ANDROID__)4344// We don't actually want to intercept operator new and delete on Android, but45// since we previously released a runtime that intercepted these functions,46// removing the interceptors would break ABI. Therefore we simply forward to47// malloc and free.48# define OPERATOR_NEW_BODY(nothrow) return malloc(size)49# define OPERATOR_DELETE_BODY free(ptr)5051#endif5253#ifdef OPERATOR_NEW_BODY5455using namespace __hwasan;5657// Fake std::nothrow_t to avoid including <new>.58namespace std {59struct nothrow_t {};60} // namespace std6162INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(size_t size) {63OPERATOR_NEW_BODY(false /*nothrow*/);64}65INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](66size_t size) {67OPERATOR_NEW_BODY(false /*nothrow*/);68}69INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(70size_t size, std::nothrow_t const &) {71OPERATOR_NEW_BODY(true /*nothrow*/);72}73INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](74size_t size, std::nothrow_t const &) {75OPERATOR_NEW_BODY(true /*nothrow*/);76}7778INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(79void *ptr) NOEXCEPT {80OPERATOR_DELETE_BODY;81}82INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](83void *ptr) NOEXCEPT {84OPERATOR_DELETE_BODY;85}86INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(87void *ptr, std::nothrow_t const &) {88OPERATOR_DELETE_BODY;89}90INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](91void *ptr, std::nothrow_t const &) {92OPERATOR_DELETE_BODY;93}94INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(95void *ptr, size_t) NOEXCEPT {96OPERATOR_DELETE_BODY;97}98INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](99void *ptr, size_t) NOEXCEPT {100OPERATOR_DELETE_BODY;101}102103#endif // OPERATOR_NEW_BODY104105#ifdef OPERATOR_NEW_ALIGN_BODY106107namespace std {108enum class align_val_t : size_t {};109} // namespace std110111INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(112size_t size, std::align_val_t align) {113OPERATOR_NEW_ALIGN_BODY(false /*nothrow*/);114}115INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](116size_t size, std::align_val_t align) {117OPERATOR_NEW_ALIGN_BODY(false /*nothrow*/);118}119INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new(120size_t size, std::align_val_t align, std::nothrow_t const &) {121OPERATOR_NEW_ALIGN_BODY(true /*nothrow*/);122}123INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new[](124size_t size, std::align_val_t align, std::nothrow_t const &) {125OPERATOR_NEW_ALIGN_BODY(true /*nothrow*/);126}127128INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(129void *ptr, std::align_val_t align) NOEXCEPT {130OPERATOR_DELETE_BODY;131}132INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](133void *ptr, std::align_val_t) NOEXCEPT {134OPERATOR_DELETE_BODY;135}136INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(137void *ptr, std::align_val_t, std::nothrow_t const &) NOEXCEPT {138OPERATOR_DELETE_BODY;139}140INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](141void *ptr, std::align_val_t, std::nothrow_t const &) NOEXCEPT {142OPERATOR_DELETE_BODY;143}144INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(145void *ptr, size_t, std::align_val_t) NOEXCEPT {146OPERATOR_DELETE_BODY;147}148INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](149void *ptr, size_t, std::align_val_t) NOEXCEPT {150OPERATOR_DELETE_BODY;151}152INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(153void *ptr, size_t, std::align_val_t, std::nothrow_t const &) NOEXCEPT {154OPERATOR_DELETE_BODY;155}156INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[](157void *ptr, size_t, std::align_val_t, std::nothrow_t const &) NOEXCEPT {158OPERATOR_DELETE_BODY;159}160161#endif // OPERATOR_NEW_ALIGN_BODY162163164