1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_MEMORY_SAFETY_CHECKS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_MEMORY_SAFETY_CHECKS_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <new>
9*6777b538SAndroid Build Coastguard Worker #include <type_traits>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h"
13*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/partition_alloc_buildflags.h"
14*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/partition_alloc_constants.h"
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
17*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
18*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker // This header defines following macros:
21*6777b538SAndroid Build Coastguard Worker // - ADVANCED_MEMORY_SAFETY_CHECKS()
22*6777b538SAndroid Build Coastguard Worker // They can be used to specify a class/struct that is targeted to perform
23*6777b538SAndroid Build Coastguard Worker // additional CHECKS across variety of memory safety mechanisms such as
24*6777b538SAndroid Build Coastguard Worker // PartitionAllocator.
25*6777b538SAndroid Build Coastguard Worker //
26*6777b538SAndroid Build Coastguard Worker // class Foo {
27*6777b538SAndroid Build Coastguard Worker // ADVANCED_MEMORY_SAFETY_CHECKS();
28*6777b538SAndroid Build Coastguard Worker // }
29*6777b538SAndroid Build Coastguard Worker //
30*6777b538SAndroid Build Coastguard Worker // Checks here are disabled by default because of their performance cost.
31*6777b538SAndroid Build Coastguard Worker // Currently, the macro is managed by the memory safety team internally and
32*6777b538SAndroid Build Coastguard Worker // you should not add / remove it manually.
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker // We cannot hide things behind anonymous namespace because they are referenced
35*6777b538SAndroid Build Coastguard Worker // via macro, which can be defined anywhere.
36*6777b538SAndroid Build Coastguard Worker // To avoid tainting ::base namespace, define things inside this namespace.
37*6777b538SAndroid Build Coastguard Worker namespace base::internal {
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker enum class MemorySafetyCheck : uint32_t {
40*6777b538SAndroid Build Coastguard Worker kForcePartitionAlloc = (1u << 0),
41*6777b538SAndroid Build Coastguard Worker // Enables |FreeFlags::kSchedulerLoopQuarantine|.
42*6777b538SAndroid Build Coastguard Worker // Requires PA-E.
43*6777b538SAndroid Build Coastguard Worker kSchedulerLoopQuarantine = (1u << 1),
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker // Enables |FreeFlags::kZap|.
46*6777b538SAndroid Build Coastguard Worker // Requires PA-E.
47*6777b538SAndroid Build Coastguard Worker kZapOnFree = (1u << 2),
48*6777b538SAndroid Build Coastguard Worker };
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker constexpr MemorySafetyCheck operator|(MemorySafetyCheck a,
51*6777b538SAndroid Build Coastguard Worker MemorySafetyCheck b) {
52*6777b538SAndroid Build Coastguard Worker return static_cast<MemorySafetyCheck>(static_cast<uint32_t>(a) |
53*6777b538SAndroid Build Coastguard Worker static_cast<uint32_t>(b));
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker constexpr MemorySafetyCheck operator&(MemorySafetyCheck a,
57*6777b538SAndroid Build Coastguard Worker MemorySafetyCheck b) {
58*6777b538SAndroid Build Coastguard Worker return static_cast<MemorySafetyCheck>(static_cast<uint32_t>(a) &
59*6777b538SAndroid Build Coastguard Worker static_cast<uint32_t>(b));
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker // Set of checks for ADVANCED_MEMORY_SAFETY_CHECKS() annotated objects.
63*6777b538SAndroid Build Coastguard Worker constexpr auto kAdvancedMemorySafetyChecks =
64*6777b538SAndroid Build Coastguard Worker MemorySafetyCheck::kForcePartitionAlloc |
65*6777b538SAndroid Build Coastguard Worker MemorySafetyCheck::kSchedulerLoopQuarantine | MemorySafetyCheck::kZapOnFree;
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker // Define type traits to determine type |T|'s memory safety check status.
68*6777b538SAndroid Build Coastguard Worker namespace {
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker // Allocator type traits.
ShouldUsePartitionAlloc(MemorySafetyCheck checks)71*6777b538SAndroid Build Coastguard Worker constexpr bool ShouldUsePartitionAlloc(MemorySafetyCheck checks) {
72*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
73*6777b538SAndroid Build Coastguard Worker return static_cast<bool>(checks &
74*6777b538SAndroid Build Coastguard Worker (MemorySafetyCheck::kForcePartitionAlloc |
75*6777b538SAndroid Build Coastguard Worker MemorySafetyCheck::kSchedulerLoopQuarantine |
76*6777b538SAndroid Build Coastguard Worker MemorySafetyCheck::kZapOnFree));
77*6777b538SAndroid Build Coastguard Worker #else
78*6777b538SAndroid Build Coastguard Worker return false;
79*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Worker // Returns |partition_alloc::AllocFlags| corresponding to |checks|.
GetAllocFlags(MemorySafetyCheck checks)83*6777b538SAndroid Build Coastguard Worker constexpr partition_alloc::AllocFlags GetAllocFlags(MemorySafetyCheck checks) {
84*6777b538SAndroid Build Coastguard Worker return partition_alloc::AllocFlags::kReturnNull |
85*6777b538SAndroid Build Coastguard Worker partition_alloc::AllocFlags::kNoHooks;
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker // Returns |partition_alloc::FreeFlags| corresponding to |checks|.
GetFreeFlags(MemorySafetyCheck checks)89*6777b538SAndroid Build Coastguard Worker constexpr partition_alloc::FreeFlags GetFreeFlags(MemorySafetyCheck checks) {
90*6777b538SAndroid Build Coastguard Worker auto flags = partition_alloc::FreeFlags::kNone;
91*6777b538SAndroid Build Coastguard Worker if (static_cast<bool>(checks & MemorySafetyCheck::kSchedulerLoopQuarantine)) {
92*6777b538SAndroid Build Coastguard Worker flags |= partition_alloc::FreeFlags::kSchedulerLoopQuarantine;
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker if (static_cast<bool>(checks & MemorySafetyCheck::kZapOnFree)) {
95*6777b538SAndroid Build Coastguard Worker flags |= partition_alloc::FreeFlags::kZap;
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker return flags;
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker } // namespace
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker // Public utility type traits.
103*6777b538SAndroid Build Coastguard Worker template <typename T>
104*6777b538SAndroid Build Coastguard Worker inline constexpr MemorySafetyCheck get_memory_safety_checks = [] {
105*6777b538SAndroid Build Coastguard Worker if constexpr (requires { T::kMemorySafetyChecks; }) {
106*6777b538SAndroid Build Coastguard Worker return T::kMemorySafetyChecks;
107*6777b538SAndroid Build Coastguard Worker } else {
108*6777b538SAndroid Build Coastguard Worker return static_cast<MemorySafetyCheck>(0);
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker }();
111*6777b538SAndroid Build Coastguard Worker
112*6777b538SAndroid Build Coastguard Worker template <typename T, MemorySafetyCheck c>
113*6777b538SAndroid Build Coastguard Worker inline constexpr bool is_memory_safety_checked =
114*6777b538SAndroid Build Coastguard Worker (get_memory_safety_checks<T> & c) == c;
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker // Allocator functions.
117*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
118*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE partition_alloc::PartitionRoot*
GetPartitionRootForMemorySafetyCheckedAllocation()119*6777b538SAndroid Build Coastguard Worker GetPartitionRootForMemorySafetyCheckedAllocation() {
120*6777b538SAndroid Build Coastguard Worker return allocator_shim::internal::PartitionAllocMalloc::Allocator();
121*6777b538SAndroid Build Coastguard Worker }
122*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker template <MemorySafetyCheck checks>
HandleMemorySafetyCheckedOperatorNew(std::size_t count)125*6777b538SAndroid Build Coastguard Worker NOINLINE void* HandleMemorySafetyCheckedOperatorNew(std::size_t count) {
126*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
127*6777b538SAndroid Build Coastguard Worker if constexpr (ShouldUsePartitionAlloc(checks)) {
128*6777b538SAndroid Build Coastguard Worker return GetPartitionRootForMemorySafetyCheckedAllocation()
129*6777b538SAndroid Build Coastguard Worker ->AllocInline<GetAllocFlags(checks)>(count);
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
132*6777b538SAndroid Build Coastguard Worker return ::operator new(count);
133*6777b538SAndroid Build Coastguard Worker }
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker template <MemorySafetyCheck checks>
HandleMemorySafetyCheckedOperatorNew(std::size_t count,std::align_val_t alignment)136*6777b538SAndroid Build Coastguard Worker NOINLINE void* HandleMemorySafetyCheckedOperatorNew(
137*6777b538SAndroid Build Coastguard Worker std::size_t count,
138*6777b538SAndroid Build Coastguard Worker std::align_val_t alignment) {
139*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
140*6777b538SAndroid Build Coastguard Worker if constexpr (ShouldUsePartitionAlloc(checks)) {
141*6777b538SAndroid Build Coastguard Worker return GetPartitionRootForMemorySafetyCheckedAllocation()
142*6777b538SAndroid Build Coastguard Worker ->AlignedAlloc<GetAllocFlags(checks)>(static_cast<size_t>(alignment),
143*6777b538SAndroid Build Coastguard Worker count);
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
146*6777b538SAndroid Build Coastguard Worker return ::operator new(count, alignment);
147*6777b538SAndroid Build Coastguard Worker }
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker template <MemorySafetyCheck checks>
HandleMemorySafetyCheckedOperatorDelete(void * ptr)150*6777b538SAndroid Build Coastguard Worker NOINLINE void HandleMemorySafetyCheckedOperatorDelete(void* ptr) {
151*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
152*6777b538SAndroid Build Coastguard Worker if constexpr (ShouldUsePartitionAlloc(checks)) {
153*6777b538SAndroid Build Coastguard Worker GetPartitionRootForMemorySafetyCheckedAllocation()
154*6777b538SAndroid Build Coastguard Worker ->Free<GetFreeFlags(checks)>(ptr);
155*6777b538SAndroid Build Coastguard Worker return;
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
158*6777b538SAndroid Build Coastguard Worker ::operator delete(ptr);
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker template <MemorySafetyCheck checks>
HandleMemorySafetyCheckedOperatorDelete(void * ptr,std::align_val_t alignment)162*6777b538SAndroid Build Coastguard Worker NOINLINE void HandleMemorySafetyCheckedOperatorDelete(
163*6777b538SAndroid Build Coastguard Worker void* ptr,
164*6777b538SAndroid Build Coastguard Worker std::align_val_t alignment) {
165*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
166*6777b538SAndroid Build Coastguard Worker if constexpr (ShouldUsePartitionAlloc(checks)) {
167*6777b538SAndroid Build Coastguard Worker GetPartitionRootForMemorySafetyCheckedAllocation()
168*6777b538SAndroid Build Coastguard Worker ->Free<GetFreeFlags(checks)>(ptr);
169*6777b538SAndroid Build Coastguard Worker return;
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
172*6777b538SAndroid Build Coastguard Worker ::operator delete(ptr, alignment);
173*6777b538SAndroid Build Coastguard Worker }
174*6777b538SAndroid Build Coastguard Worker
175*6777b538SAndroid Build Coastguard Worker } // namespace base::internal
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker // Macros to annotate class/struct's default memory safety check.
178*6777b538SAndroid Build Coastguard Worker // ADVANCED_MEMORY_SAFETY_CHECKS(): Enable Check |kAdvancedChecks| for this
179*6777b538SAndroid Build Coastguard Worker // object.
180*6777b538SAndroid Build Coastguard Worker //
181*6777b538SAndroid Build Coastguard Worker // Note that if you use this macro at the top of struct declaration, the
182*6777b538SAndroid Build Coastguard Worker // declaration context would be left as |private|. Please switch it back to
183*6777b538SAndroid Build Coastguard Worker // |public| manually if needed.
184*6777b538SAndroid Build Coastguard Worker //
185*6777b538SAndroid Build Coastguard Worker // struct ObjectWithAdvancedChecks {
186*6777b538SAndroid Build Coastguard Worker // ADVANCED_MEMORY_SAFETY_CHECKS();
187*6777b538SAndroid Build Coastguard Worker // public:
188*6777b538SAndroid Build Coastguard Worker // int public_field;
189*6777b538SAndroid Build Coastguard Worker // };
190*6777b538SAndroid Build Coastguard Worker #define ADVANCED_MEMORY_SAFETY_CHECKS_INTERNAL(SPECIFIER) \
191*6777b538SAndroid Build Coastguard Worker public: \
192*6777b538SAndroid Build Coastguard Worker static constexpr auto kMemorySafetyChecks = \
193*6777b538SAndroid Build Coastguard Worker base::internal::kAdvancedMemorySafetyChecks; \
194*6777b538SAndroid Build Coastguard Worker SPECIFIER static void* operator new(std::size_t count) { \
195*6777b538SAndroid Build Coastguard Worker return base::internal::HandleMemorySafetyCheckedOperatorNew< \
196*6777b538SAndroid Build Coastguard Worker kMemorySafetyChecks>(count); \
197*6777b538SAndroid Build Coastguard Worker } \
198*6777b538SAndroid Build Coastguard Worker SPECIFIER static void* operator new(std::size_t count, \
199*6777b538SAndroid Build Coastguard Worker std::align_val_t alignment) { \
200*6777b538SAndroid Build Coastguard Worker return base::internal::HandleMemorySafetyCheckedOperatorNew< \
201*6777b538SAndroid Build Coastguard Worker kMemorySafetyChecks>(count, alignment); \
202*6777b538SAndroid Build Coastguard Worker } \
203*6777b538SAndroid Build Coastguard Worker /* Though we do not hook placement new, we need to define this */ \
204*6777b538SAndroid Build Coastguard Worker /* explicitly to allow it. */ \
205*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE static void* operator new(std::size_t, void* ptr) { \
206*6777b538SAndroid Build Coastguard Worker return ptr; \
207*6777b538SAndroid Build Coastguard Worker } \
208*6777b538SAndroid Build Coastguard Worker SPECIFIER static void operator delete(void* ptr) noexcept { \
209*6777b538SAndroid Build Coastguard Worker base::internal::HandleMemorySafetyCheckedOperatorDelete< \
210*6777b538SAndroid Build Coastguard Worker kMemorySafetyChecks>(ptr); \
211*6777b538SAndroid Build Coastguard Worker } \
212*6777b538SAndroid Build Coastguard Worker SPECIFIER static void operator delete(void* ptr, \
213*6777b538SAndroid Build Coastguard Worker std::align_val_t alignment) noexcept { \
214*6777b538SAndroid Build Coastguard Worker base::internal::HandleMemorySafetyCheckedOperatorDelete< \
215*6777b538SAndroid Build Coastguard Worker kMemorySafetyChecks>(ptr, alignment); \
216*6777b538SAndroid Build Coastguard Worker } \
217*6777b538SAndroid Build Coastguard Worker \
218*6777b538SAndroid Build Coastguard Worker private: \
219*6777b538SAndroid Build Coastguard Worker static_assert(true) /* semicolon here */
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
222*6777b538SAndroid Build Coastguard Worker // Specify NOINLINE to display the operator on a stack trace.
223*6777b538SAndroid Build Coastguard Worker #define ADVANCED_MEMORY_SAFETY_CHECKS() \
224*6777b538SAndroid Build Coastguard Worker ADVANCED_MEMORY_SAFETY_CHECKS_INTERNAL(NOINLINE NOT_TAIL_CALLED)
225*6777b538SAndroid Build Coastguard Worker #else
226*6777b538SAndroid Build Coastguard Worker #define ADVANCED_MEMORY_SAFETY_CHECKS() \
227*6777b538SAndroid Build Coastguard Worker ADVANCED_MEMORY_SAFETY_CHECKS_INTERNAL(ALWAYS_INLINE)
228*6777b538SAndroid Build Coastguard Worker #endif // DCHECK_IS_ON()
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker // When a struct/class with `ADVANCED_MEMORY_SAFETY_CHECKS()` is inherited, a
231*6777b538SAndroid Build Coastguard Worker // derived struct/class operator will use customized `operator new()` and
232*6777b538SAndroid Build Coastguard Worker // `operator delete()` too. If a class has multiple base classes with the macro,
233*6777b538SAndroid Build Coastguard Worker // a compiler may complain ambiguity between multiple `operator new()`s. On the
234*6777b538SAndroid Build Coastguard Worker // other hand, if a class uses private inheritance, a compiler may report
235*6777b538SAndroid Build Coastguard Worker // private `operator new()` that is making impossible to `new` that class. We
236*6777b538SAndroid Build Coastguard Worker // have two utility macros to resolve these issues:
237*6777b538SAndroid Build Coastguard Worker // - `INHERIT_MEMORY_SAFETY_CHECKS(BaseClass)`
238*6777b538SAndroid Build Coastguard Worker // Explicitly exports operators from given `BaseClass` to re-apply
239*6777b538SAndroid Build Coastguard Worker // checks specified in the parent class. This is the recommended option as
240*6777b538SAndroid Build Coastguard Worker // a derived class is likely to have the same characteristics to its baes
241*6777b538SAndroid Build Coastguard Worker // class.
242*6777b538SAndroid Build Coastguard Worker // - `DEFAULT_MEMORY_SAFETY_CHECKS()`
243*6777b538SAndroid Build Coastguard Worker // Re-define default `operator new()` and `operator delete()` using
244*6777b538SAndroid Build Coastguard Worker // global operators that comes with default checks.
245*6777b538SAndroid Build Coastguard Worker //
246*6777b538SAndroid Build Coastguard Worker // Note that if you use these macros at the top of struct declaration, the
247*6777b538SAndroid Build Coastguard Worker // declaration context would be left as |private|. Please switch it back to
248*6777b538SAndroid Build Coastguard Worker // |public| manually if needed.
249*6777b538SAndroid Build Coastguard Worker #define INHERIT_MEMORY_SAFETY_CHECKS(BASE_CLASS) \
250*6777b538SAndroid Build Coastguard Worker public: \
251*6777b538SAndroid Build Coastguard Worker using BASE_CLASS::kMemorySafetyChecks; \
252*6777b538SAndroid Build Coastguard Worker using BASE_CLASS::operator new; \
253*6777b538SAndroid Build Coastguard Worker using BASE_CLASS::operator delete; \
254*6777b538SAndroid Build Coastguard Worker \
255*6777b538SAndroid Build Coastguard Worker private: \
256*6777b538SAndroid Build Coastguard Worker static_assert(true) /* semicolon here */
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker #define DEFAULT_MEMORY_SAFETY_CHECKS() \
259*6777b538SAndroid Build Coastguard Worker public: \
260*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE static void* operator new(std::size_t count) { \
261*6777b538SAndroid Build Coastguard Worker return ::operator new(count); \
262*6777b538SAndroid Build Coastguard Worker } \
263*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE static void* operator new(std::size_t count, \
264*6777b538SAndroid Build Coastguard Worker std::align_val_t alignment) { \
265*6777b538SAndroid Build Coastguard Worker return ::operator new(count, alignment); \
266*6777b538SAndroid Build Coastguard Worker } \
267*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE static void* operator new(std::size_t count, void* ptr) { \
268*6777b538SAndroid Build Coastguard Worker return ::operator new(count, ptr); \
269*6777b538SAndroid Build Coastguard Worker } \
270*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE static void operator delete(void* ptr) noexcept { \
271*6777b538SAndroid Build Coastguard Worker return ::operator delete(ptr); \
272*6777b538SAndroid Build Coastguard Worker } \
273*6777b538SAndroid Build Coastguard Worker ALWAYS_INLINE static void operator delete( \
274*6777b538SAndroid Build Coastguard Worker void* ptr, std::align_val_t alignment) noexcept { \
275*6777b538SAndroid Build Coastguard Worker return ::operator delete(ptr, alignment); \
276*6777b538SAndroid Build Coastguard Worker } \
277*6777b538SAndroid Build Coastguard Worker \
278*6777b538SAndroid Build Coastguard Worker private: \
279*6777b538SAndroid Build Coastguard Worker static_assert(true) /* semicolon here */
280*6777b538SAndroid Build Coastguard Worker
281*6777b538SAndroid Build Coastguard Worker #endif // BASE_MEMORY_SAFETY_CHECKS_H_
282