Home | History | Annotate | Download | only in debug
      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_
     66