1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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_DEBUG_LEAK_ANNOTATIONS_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_DEBUG_LEAK_ANNOTATIONS_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker // This file defines macros which can be used to annotate intentional memory 11*6777b538SAndroid Build Coastguard Worker // leaks. Support for annotations is implemented in LeakSanitizer. Annotated 12*6777b538SAndroid Build Coastguard Worker // objects will be treated as a source of live pointers, i.e. any heap objects 13*6777b538SAndroid Build Coastguard Worker // reachable by following pointers from an annotated object will not be 14*6777b538SAndroid Build Coastguard Worker // reported as leaks. 15*6777b538SAndroid Build Coastguard Worker // 16*6777b538SAndroid Build Coastguard Worker // ANNOTATE_SCOPED_MEMORY_LEAK: all allocations made in the current scope 17*6777b538SAndroid Build Coastguard Worker // will be annotated as leaks. 18*6777b538SAndroid Build Coastguard Worker // ANNOTATE_LEAKING_OBJECT_PTR(X): the heap object referenced by pointer X will 19*6777b538SAndroid Build Coastguard Worker // be annotated as a leak. 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker #if defined(LEAK_SANITIZER) && !BUILDFLAG(IS_NACL) 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker #include <sanitizer/lsan_interface.h> 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker class ScopedLeakSanitizerDisabler { 26*6777b538SAndroid Build Coastguard Worker public: ScopedLeakSanitizerDisabler()27*6777b538SAndroid Build Coastguard Worker ScopedLeakSanitizerDisabler() { __lsan_disable(); } 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker ScopedLeakSanitizerDisabler(const ScopedLeakSanitizerDisabler&) = delete; 30*6777b538SAndroid Build Coastguard Worker ScopedLeakSanitizerDisabler& operator=(const ScopedLeakSanitizerDisabler&) = 31*6777b538SAndroid Build Coastguard Worker delete; 32*6777b538SAndroid Build Coastguard Worker ~ScopedLeakSanitizerDisabler()33*6777b538SAndroid Build Coastguard Worker ~ScopedLeakSanitizerDisabler() { __lsan_enable(); } 34*6777b538SAndroid Build Coastguard Worker }; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker #define ANNOTATE_SCOPED_MEMORY_LEAK \ 37*6777b538SAndroid Build Coastguard Worker ScopedLeakSanitizerDisabler leak_sanitizer_disabler; static_cast<void>(0) 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker #define ANNOTATE_LEAKING_OBJECT_PTR(X) __lsan_ignore_object(X); 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker #else 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker #define ANNOTATE_SCOPED_MEMORY_LEAK ((void)0) 44*6777b538SAndroid Build Coastguard Worker #define ANNOTATE_LEAKING_OBJECT_PTR(X) ((void)0) 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker #endif 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker #endif // BASE_DEBUG_LEAK_ANNOTATIONS_H_ 49