1 //=-- lsan_common.h -------------------------------------------------------===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of LeakSanitizer.
9 // Private LSan header.
11 //===----------------------------------------------------------------------===//
16 #include "sanitizer_common/sanitizer_allocator.h"
17 #include "sanitizer_common/sanitizer_common.h"
18 #include "sanitizer_common/sanitizer_internal_defs.h"
19 #include "sanitizer_common/sanitizer_platform.h"
20 #include "sanitizer_common/sanitizer_symbolizer.h"
22 #if SANITIZER_LINUX && defined(__x86_64__)
23 #define CAN_SANITIZE_LEAKS 1
25 #define CAN_SANITIZE_LEAKS 0
32 kDirectlyLeaked
= 0, // default
33 kIndirectlyLeaked
= 1,
39 uptr
pointer_alignment() const {
40 return use_unaligned
? 1 : sizeof(uptr
);
43 // Print addresses of leaked objects after main leak report.
45 // Aggregate two objects into one leak if this many stack frames match. If
46 // zero, the entire stack trace must match.
48 // The number of leaks reported.
50 // If nonzero kill the process with this exit code upon finding leaks.
52 // Suppressions file name.
53 const char* suppressions
;
55 // Flags controlling the root set of reachable memory.
56 // Global variables (.data and .bss).
62 // TLS and thread-specific storage.
65 // Consider unaligned pointers valid.
68 // User-visible verbosity.
76 extern Flags lsan_flags
;
77 inline Flags
*flags() { return &lsan_flags
; }
83 bool is_directly_leaked
;
87 // Aggregates leaks by stack trace prefix.
90 LeakReport() : leaks_(1) {}
91 void Add(u32 stack_trace_id
, uptr leaked_size
, ChunkTag tag
);
92 void PrintLargest(uptr max_leaks
);
94 bool IsEmpty() { return leaks_
.size() == 0; }
95 uptr
ApplySuppressions();
97 InternalMmapVector
<Leak
> leaks_
;
100 typedef InternalMmapVector
<uptr
> Frontier
;
102 // Platform-specific functions.
103 void InitializePlatformSpecificModules();
104 void ProcessGlobalRegions(Frontier
*frontier
);
105 void ProcessPlatformSpecificAllocations(Frontier
*frontier
);
107 void ScanRangeForPointers(uptr begin
, uptr end
,
109 const char *region_type
, ChunkTag tag
);
111 enum IgnoreObjectResult
{
112 kIgnoreObjectSuccess
,
113 kIgnoreObjectAlreadyIgnored
,
117 // Functions called from the parent tool.
118 void InitCommonLsan();
120 bool DisabledInThisThread();
122 // The following must be implemented in the parent tool.
124 void ForEachChunk(ForEachChunkCallback callback
, void *arg
);
125 // Returns the address range occupied by the global allocator object.
126 void GetAllocatorGlobalRange(uptr
*begin
, uptr
*end
);
127 // Wrappers for allocator's ForceLock()/ForceUnlock().
128 void LockAllocator();
129 void UnlockAllocator();
130 // Wrappers for ThreadRegistry access.
131 void LockThreadRegistry();
132 void UnlockThreadRegistry();
133 bool GetThreadRangesLocked(uptr os_id
, uptr
*stack_begin
, uptr
*stack_end
,
134 uptr
*tls_begin
, uptr
*tls_end
,
135 uptr
*cache_begin
, uptr
*cache_end
);
136 void ForEachExtraStackRange(uptr os_id
, RangeIteratorCallback callback
,
138 // If called from the main thread, updates the main thread's TID in the thread
139 // registry. We need this to handle processes that fork() without a subsequent
140 // exec(), which invalidates the recorded TID. To update it, we must call
141 // gettid() from the main thread. Our solution is to call this function before
142 // leak checking and also before every call to pthread_create() (to handle cases
143 // where leak checking is initiated from a non-main thread).
144 void EnsureMainThreadIDIsCorrect();
145 // If p points into a chunk that has been allocated to the user, returns its
146 // user-visible address. Otherwise, returns 0.
147 uptr
PointsIntoChunk(void *p
);
148 // Returns address of user-visible chunk contained in this allocator chunk.
149 uptr
GetUserBegin(uptr chunk
);
150 // Helper for __lsan_ignore_object().
151 IgnoreObjectResult
IgnoreObjectLocked(const void *p
);
152 // Wrapper for chunk metadata operations.
155 // Constructor accepts address of user-visible chunk.
156 explicit LsanMetadata(uptr chunk
);
157 bool allocated() const;
158 ChunkTag
tag() const;
159 void set_tag(ChunkTag value
);
160 uptr
requested_size() const;
161 u32
stack_trace_id() const;
166 } // namespace __lsan
169 SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
170 int __lsan_is_turned_off();
172 SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
173 const char *__lsan_default_suppressions();
176 #endif // LSAN_COMMON_H