UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MallocPoisonProxy.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
7#include "HAL/MemoryBase.h"
8#include "HAL/UnrealMemory.h"
9
11#if !defined(UE_USE_MALLOC_FILL_BYTES)
12 #define UE_USE_MALLOC_FILL_BYTES ((UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT) && !WITH_EDITORONLY_DATA && !PLATFORM_USES_FIXED_GMalloc_CLASS && !USING_ADDRESS_SANITISER)
13#endif // !defined(UE_USE_MALLOC_FILL_BYTES)
14
16#define UE_DEBUG_FILL_FREED (0xdd)
17
19#define UE_DEBUG_FILL_NEW (0xcd)
20
25{
26private:
28 FMalloc* UsedMalloc;
29
30public:
31 // FMalloc interface begin
33 : UsedMalloc(InMalloc)
34 {
35 checkf(UsedMalloc, TEXT("FMallocPoisonProxy is used without a valid malloc!"));
36 }
37
38 virtual void InitializeStatsMetadata() override
39 {
40 UsedMalloc->InitializeStatsMetadata();
41 }
42
43 virtual void* Malloc(SIZE_T Size, uint32 Alignment) override
44 {
45 void* Result = UsedMalloc->Malloc(Size, Alignment);
46 if (LIKELY(Result != nullptr && Size > 0))
47 {
49 }
50 return Result;
51 }
52
53 virtual void* MallocZeroed(SIZE_T Size, uint32 Alignment) override
54 {
55 void* Result = UsedMalloc->Malloc(Size, Alignment);
56 if (LIKELY(Result != nullptr && Size > 0))
57 {
58 FMemory::Memset(Result, 0, Size);
59 }
60 return Result;
61 }
62
63 virtual void* Realloc(void* Ptr, SIZE_T NewSize, uint32 Alignment) override
64 {
65 // NOTE: case when Realloc returns completely new pointer is not handled properly (we would like to have previous memory poisoned completely).
66 // This can be done by avoiding calling Realloc() of the nested allocator and Malloc()/Free()'ing directly, but this is deemed unacceptable
67 // from a performance/fragmentation standpoint.
68 SIZE_T OldSize = 0;
69 if (Ptr != nullptr && GetAllocationSize(Ptr, OldSize) && OldSize > 0 && OldSize > NewSize)
70 {
71 FMemory::Memset(static_cast<uint8*>(Ptr) + NewSize, UE_DEBUG_FILL_FREED, OldSize - NewSize);
72 }
73
74 void* Result = UsedMalloc->Realloc(Ptr, NewSize, Alignment);
75
76 if (Result != nullptr && OldSize > 0 && OldSize < NewSize)
77 {
78 FMemory::Memset(static_cast<uint8*>(Result) + OldSize, UE_DEBUG_FILL_NEW, NewSize - OldSize);
79 }
80
81 return Result;
82 }
83
84 virtual void Free(void* Ptr) override
85 {
86 if (LIKELY(Ptr))
87 {
88 SIZE_T AllocSize;
89 if (LIKELY(GetAllocationSize(Ptr, AllocSize) && AllocSize > 0))
90 {
91 FMemory::Memset(Ptr, UE_DEBUG_FILL_FREED, AllocSize);
92 }
93 UsedMalloc->Free(Ptr);
94 }
95 }
96
97 virtual SIZE_T QuantizeSize(SIZE_T Count, uint32 Alignment) override
98 {
99 return UsedMalloc->QuantizeSize(Count, Alignment);
100 }
101
102 virtual void UpdateStats() override
103 {
104 UsedMalloc->UpdateStats();
105 }
106
108 {
109 UsedMalloc->GetAllocatorStats( out_Stats );
110 }
111
112 virtual void DumpAllocatorStats( class FOutputDevice& Ar ) override
113 {
114 UsedMalloc->DumpAllocatorStats( Ar );
115 }
116
117 virtual bool IsInternallyThreadSafe() const override
118 {
119 return UsedMalloc->IsInternallyThreadSafe();
120 }
121
122 virtual bool ValidateHeap() override
123 {
124 return UsedMalloc->ValidateHeap();
125 }
126
127#if UE_ALLOW_EXEC_COMMANDS
128 virtual bool Exec( UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar ) override
129 {
130 return UsedMalloc->Exec(InWorld, Cmd, Ar);
131 }
132#endif // UE_ALLOW_EXEC_COMMANDS
133
134 virtual bool GetAllocationSize(void *Original, SIZE_T &SizeOut) override
135 {
136 return UsedMalloc->GetAllocationSize(Original,SizeOut);
137 }
138
139 virtual const TCHAR* GetDescriptiveName() override
140 {
141 return UsedMalloc->GetDescriptiveName();
142 }
143
144 virtual void Trim(bool bTrimThreadCaches) override
145 {
146 UsedMalloc->Trim(bTrimThreadCaches);
147 }
148
149 virtual void SetupTLSCachesOnCurrentThread() override
150 {
151 UsedMalloc->SetupTLSCachesOnCurrentThread();
152 }
153
155 {
157 }
158
160 {
162 }
163
165 {
167 }
168
169 virtual void OnMallocInitialized() override
170 {
171 UsedMalloc->OnMallocInitialized();
172 }
173
174 virtual void OnPreFork() override
175 {
176 UsedMalloc->OnPreFork();
177 }
178
179
180 virtual void OnPostFork() override
181 {
182 UsedMalloc->OnPostFork();
183 }
184
185 // FMalloc interface end
186};
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define LIKELY(x)
Definition CityHash.cpp:107
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_DEBUG_FILL_FREED
Definition MallocPoisonProxy.h:16
#define UE_DEBUG_FILL_NEW
Definition MallocPoisonProxy.h:19
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
virtual CORE_API bool Exec(UWorld *InWorld, const TCHAR *Cmd, FOutputDevice &Ar)
Definition Exec.cpp:30
Definition MallocPoisonProxy.h:25
virtual void DumpAllocatorStats(class FOutputDevice &Ar) override
Definition MallocPoisonProxy.h:112
virtual SIZE_T QuantizeSize(SIZE_T Count, uint32 Alignment) override
Definition MallocPoisonProxy.h:97
virtual const TCHAR * GetDescriptiveName() override
Definition MallocPoisonProxy.h:139
virtual void OnPreFork() override
Definition MallocPoisonProxy.h:174
virtual void MarkTLSCachesAsUnusedOnCurrentThread() override
Definition MallocPoisonProxy.h:159
virtual void InitializeStatsMetadata() override
Definition MallocPoisonProxy.h:38
virtual bool GetAllocationSize(void *Original, SIZE_T &SizeOut) override
Definition MallocPoisonProxy.h:134
virtual void GetAllocatorStats(FGenericMemoryStats &out_Stats) override
Definition MallocPoisonProxy.h:107
virtual void * Malloc(SIZE_T Size, uint32 Alignment) override
Definition MallocPoisonProxy.h:43
virtual void SetupTLSCachesOnCurrentThread() override
Definition MallocPoisonProxy.h:149
virtual void OnMallocInitialized() override
Definition MallocPoisonProxy.h:169
virtual void Free(void *Ptr) override
Definition MallocPoisonProxy.h:84
virtual void * Realloc(void *Ptr, SIZE_T NewSize, uint32 Alignment) override
Definition MallocPoisonProxy.h:63
virtual void ClearAndDisableTLSCachesOnCurrentThread() override
Definition MallocPoisonProxy.h:164
virtual void * MallocZeroed(SIZE_T Size, uint32 Alignment) override
Definition MallocPoisonProxy.h:53
FMallocPoisonProxy(FMalloc *InMalloc)
Definition MallocPoisonProxy.h:32
virtual void Trim(bool bTrimThreadCaches) override
Definition MallocPoisonProxy.h:144
virtual bool IsInternallyThreadSafe() const override
Definition MallocPoisonProxy.h:117
virtual void UpdateStats() override
Definition MallocPoisonProxy.h:102
virtual void OnPostFork() override
Definition MallocPoisonProxy.h:180
virtual bool ValidateHeap() override
Definition MallocPoisonProxy.h:122
virtual void MarkTLSCachesAsUsedOnCurrentThread() override
Definition MallocPoisonProxy.h:154
Definition MemoryBase.h:99
virtual const TCHAR * GetDescriptiveName()
Definition MemoryBase.h:248
virtual void Free(void *Original)=0
virtual void OnMallocInitialized()
Definition MemoryBase.h:256
virtual void OnPreFork()
Definition MemoryBase.h:261
virtual bool GetAllocationSize(void *Original, SIZE_T &SizeOut)
Definition MemoryBase.h:158
virtual void * Malloc(SIZE_T Count, uint32 Alignment=DEFAULT_ALIGNMENT)=0
virtual bool ValidateHeap()
Definition MemoryBase.h:238
virtual void SetupTLSCachesOnCurrentThread()
Definition MemoryBase.h:173
virtual bool IsInternallyThreadSafe() const
Definition MemoryBase.h:230
virtual void MarkTLSCachesAsUnusedOnCurrentThread()
Definition MemoryBase.h:187
virtual void DumpAllocatorStats(class FOutputDevice &Ar)
Definition MemoryBase.h:221
virtual CORE_API void GetAllocatorStats(FGenericMemoryStats &out_Stats)
Definition MemoryBase.cpp:85
virtual void MarkTLSCachesAsUsedOnCurrentThread()
Definition MemoryBase.h:180
virtual void Trim(bool bTrimThreadCaches)
Definition MemoryBase.h:166
virtual CORE_API void InitializeStatsMetadata()
Definition MemoryBase.cpp:61
virtual void * Realloc(void *Original, SIZE_T Count, uint32 Alignment=DEFAULT_ALIGNMENT)=0
virtual CORE_API void UpdateStats()
Definition MemoryBase.cpp:72
virtual void OnPostFork()
Definition MemoryBase.h:266
virtual void ClearAndDisableTLSCachesOnCurrentThread()
Definition MemoryBase.h:194
virtual SIZE_T QuantizeSize(SIZE_T Count, uint32 Alignment)
Definition MemoryBase.h:146
Definition OutputDevice.h:133
Definition World.h:918
Definition MemoryMisc.h:21
static UE_FORCEINLINE_HINT void * Memset(void *Dest, uint8 Char, SIZE_T Count)
Definition UnrealMemory.h:119