|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
|
2 // Use of this source code is governed by a BSD-style license that can be |
|
3 // found in the LICENSE file. |
|
4 |
|
5 #ifndef BASE_DEBUG_LEAK_ANNOTATIONS_H_ |
|
6 #define BASE_DEBUG_LEAK_ANNOTATIONS_H_ |
|
7 |
|
8 #include "build/build_config.h" |
|
9 |
|
10 // This file defines macros which can be used to annotate intentional memory |
|
11 // leaks. Support for annotations is implemented in HeapChecker and |
|
12 // LeakSanitizer. Annotated objects will be treated as a source of live |
|
13 // pointers, i.e. any heap objects reachable by following pointers from an |
|
14 // annotated object will not be reported as leaks. |
|
15 // |
|
16 // ANNOTATE_SCOPED_MEMORY_LEAK: all allocations made in the current scope |
|
17 // will be annotated as leaks. |
|
18 // ANNOTATE_LEAKING_OBJECT_PTR(X): the heap object referenced by pointer X will |
|
19 // be annotated as a leak. |
|
20 // |
|
21 // Note that HeapChecker will report a fatal error if an object which has been |
|
22 // annotated with ANNOTATE_LEAKING_OBJECT_PTR is later deleted (but |
|
23 // LeakSanitizer won't). |
|
24 |
|
25 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_NACL) && \ |
|
26 defined(USE_HEAPCHECKER) |
|
27 |
|
28 #include "third_party/tcmalloc/chromium/src/gperftools/heap-checker.h" |
|
29 |
|
30 #define ANNOTATE_SCOPED_MEMORY_LEAK \ |
|
31 HeapLeakChecker::Disabler heap_leak_checker_disabler; static_cast<void>(0) |
|
32 |
|
33 #define ANNOTATE_LEAKING_OBJECT_PTR(X) \ |
|
34 HeapLeakChecker::IgnoreObject(X) |
|
35 |
|
36 #elif defined(LEAK_SANITIZER) && !defined(OS_NACL) |
|
37 |
|
38 extern "C" { |
|
39 void __lsan_disable(); |
|
40 void __lsan_enable(); |
|
41 void __lsan_ignore_object(const void *p); |
|
42 } // extern "C" |
|
43 |
|
44 class ScopedLeakSanitizerDisabler { |
|
45 public: |
|
46 ScopedLeakSanitizerDisabler() { __lsan_disable(); } |
|
47 ~ScopedLeakSanitizerDisabler() { __lsan_enable(); } |
|
48 private: |
|
49 DISALLOW_COPY_AND_ASSIGN(ScopedLeakSanitizerDisabler); |
|
50 }; |
|
51 |
|
52 #define ANNOTATE_SCOPED_MEMORY_LEAK \ |
|
53 ScopedLeakSanitizerDisabler leak_sanitizer_disabler; static_cast<void>(0) |
|
54 |
|
55 #define ANNOTATE_LEAKING_OBJECT_PTR(X) __lsan_ignore_object(X); |
|
56 |
|
57 #else |
|
58 |
|
59 // If neither HeapChecker nor LSan are used, the annotations should be no-ops. |
|
60 #define ANNOTATE_SCOPED_MEMORY_LEAK ((void)0) |
|
61 #define ANNOTATE_LEAKING_OBJECT_PTR(X) ((void)0) |
|
62 |
|
63 #endif |
|
64 |
|
65 #endif // BASE_DEBUG_LEAK_ANNOTATIONS_H_ |