• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*--------------------------------------------------------------------*/
3 /*--- The leak checker.                             mc_leakcheck.c ---*/
4 /*--------------------------------------------------------------------*/
5 
6 /*
7    This file is part of MemCheck, a heavyweight Valgrind tool for
8    detecting memory errors.
9 
10    Copyright (C) 2000-2013 Julian Seward
11       jseward@acm.org
12 
13    This program is free software; you can redistribute it and/or
14    modify it under the terms of the GNU General Public License as
15    published by the Free Software Foundation; either version 2 of the
16    License, or (at your option) any later version.
17 
18    This program is distributed in the hope that it will be useful, but
19    WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    General Public License for more details.
22 
23    You should have received a copy of the GNU General Public License
24    along with this program; if not, write to the Free Software
25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26    02111-1307, USA.
27 
28    The GNU General Public License is contained in the file COPYING.
29 */
30 
31 #include "pub_tool_basics.h"
32 #include "pub_tool_vki.h"
33 #include "pub_tool_aspacehl.h"
34 #include "pub_tool_aspacemgr.h"
35 #include "pub_tool_execontext.h"
36 #include "pub_tool_hashtable.h"
37 #include "pub_tool_libcbase.h"
38 #include "pub_tool_libcassert.h"
39 #include "pub_tool_libcprint.h"
40 #include "pub_tool_libcsignal.h"
41 #include "pub_tool_machine.h"
42 #include "pub_tool_mallocfree.h"
43 #include "pub_tool_options.h"
44 #include "pub_tool_oset.h"
45 #include "pub_tool_poolalloc.h"
46 #include "pub_tool_signals.h"       // Needed for mc_include.h
47 #include "pub_tool_libcsetjmp.h"    // setjmp facilities
48 #include "pub_tool_tooliface.h"     // Needed for mc_include.h
49 
50 #include "mc_include.h"
51 
52 /*------------------------------------------------------------*/
53 /*--- An overview of leak checking.                        ---*/
54 /*------------------------------------------------------------*/
55 
56 // Leak-checking is a directed-graph traversal problem.  The graph has
57 // two kinds of nodes:
58 // - root-set nodes:
59 //   - GP registers of all threads;
60 //   - valid, aligned, pointer-sized data words in valid client memory,
61 //     including stacks, but excluding words within client heap-allocated
62 //     blocks (they are excluded so that later on we can differentiate
63 //     between heap blocks that are indirectly leaked vs. directly leaked).
64 // - heap-allocated blocks.  A block is a mempool chunk or a malloc chunk
65 //   that doesn't contain a mempool chunk.  Nb: the terms "blocks" and
66 //   "chunks" are used interchangeably below.
67 //
68 // There are two kinds of edges:
69 // - start-pointers, i.e. pointers to the start of a block;
70 // - interior-pointers, i.e. pointers to the interior of a block.
71 //
72 // We use "pointers" rather than "edges" below.
73 //
74 // Root set nodes only point to blocks.  Blocks only point to blocks;
75 // a block can point to itself.
76 //
77 // The aim is to traverse the graph and determine the status of each block.
78 //
79 // There are 9 distinct cases.  See memcheck/docs/mc-manual.xml for details.
80 // Presenting all nine categories to the user is probably too much.
81 // Currently we do this:
82 // - definitely lost:  case 3
83 // - indirectly lost:  case 4, 9
84 // - possibly lost:    cases 5..8
85 // - still reachable:  cases 1, 2
86 //
87 // It's far from clear that this is the best possible categorisation;  it's
88 // accreted over time without any central guiding principle.
89 
90 /*------------------------------------------------------------*/
91 /*--- XXX: Thoughts for improvement.                       ---*/
92 /*------------------------------------------------------------*/
93 
94 // From the user's point of view:
95 // - If they aren't using interior-pointers, they just have to fix the
96 //   directly lost blocks, and the indirectly lost ones will be fixed as
97 //   part of that.  Any possibly lost blocks will just be due to random
98 //   pointer garbage and can be ignored.
99 //
100 // - If they are using interior-pointers, the fact that they currently are not
101 //   being told which ones might be directly lost vs. indirectly lost makes
102 //   it hard to know where to begin.
103 //
104 // All this makes me wonder if new option is warranted:
105 // --follow-interior-pointers.  By default it would be off, the leak checker
106 // wouldn't follow interior-pointers and there would only be 3 categories:
107 // R, DL, IL.
108 //
109 // If turned on, then it would show 7 categories (R, DL, IL, DR/DL, IR/IL,
110 // IR/IL/DL, IL/DL).  That output is harder to understand but it's your own
111 // damn fault for using interior-pointers...
112 //
113 // ----
114 //
115 // Also, why are two blank lines printed between each loss record?
116 // [bug 197930]
117 //
118 // ----
119 //
120 // Also, --show-reachable is a bad name because it also turns on the showing
121 // of indirectly leaked blocks(!)  It would be better named --show-all or
122 // --show-all-heap-blocks, because that's the end result.
123 // We now have the option --show-leak-kinds=... which allows to specify =all.
124 //
125 // ----
126 //
127 // Also, the VALGRIND_LEAK_CHECK and VALGRIND_QUICK_LEAK_CHECK aren't great
128 // names.  VALGRIND_FULL_LEAK_CHECK and VALGRIND_SUMMARY_LEAK_CHECK would be
129 // better.
130 //
131 // ----
132 //
133 // Also, VALGRIND_COUNT_LEAKS and VALGRIND_COUNT_LEAK_BLOCKS aren't great as
134 // they combine direct leaks and indirect leaks into one.  New, more precise
135 // ones (they'll need new names) would be good.  If more categories are
136 // used, as per the --follow-interior-pointers option, they should be
137 // updated accordingly.  And they should use a struct to return the values.
138 //
139 // ----
140 //
141 // Also, for this case:
142 //
143 //  (4)  p4      BBB ---> AAA
144 //
145 // BBB is definitely directly lost.  AAA is definitely indirectly lost.
146 // Here's the relevant loss records printed for a full check (each block is
147 // 16 bytes):
148 //
149 // ==20397== 16 bytes in 1 blocks are indirectly lost in loss record 9 of 15
150 // ==20397==    at 0x4C2694E: malloc (vg_replace_malloc.c:177)
151 // ==20397==    by 0x400521: mk (leak-cases.c:49)
152 // ==20397==    by 0x400578: main (leak-cases.c:72)
153 //
154 // ==20397== 32 (16 direct, 16 indirect) bytes in 1 blocks are definitely
155 // lost in loss record 14 of 15
156 // ==20397==    at 0x4C2694E: malloc (vg_replace_malloc.c:177)
157 // ==20397==    by 0x400521: mk (leak-cases.c:49)
158 // ==20397==    by 0x400580: main (leak-cases.c:72)
159 //
160 // The first one is fine -- it describes AAA.
161 //
162 // The second one is for BBB.  It's correct in that 16 bytes in 1 block are
163 // directly lost. It's also correct that 16 are indirectly lost as a result,
164 // but it means that AAA is being counted twice in the loss records.  (It's
165 // not, thankfully, counted twice in the summary counts).  Argh.
166 //
167 // This would be less confusing for the second one:
168 //
169 // ==20397== 16 bytes in 1 blocks are definitely lost in loss record 14
170 // of 15 (and 16 bytes in 1 block are indirectly lost as a result;  they
171 // are mentioned elsewhere (if --show-reachable=yes or indirect is given
172 // in --show-leak-kinds=... !))
173 // ==20397==    at 0x4C2694E: malloc (vg_replace_malloc.c:177)
174 // ==20397==    by 0x400521: mk (leak-cases.c:49)
175 // ==20397==    by 0x400580: main (leak-cases.c:72)
176 //
177 // But ideally we'd present the loss record for the directly lost block and
178 // then the resultant indirectly lost blocks and make it clear the
179 // dependence.  Double argh.
180 
181 /*------------------------------------------------------------*/
182 /*--- The actual algorithm.                                ---*/
183 /*------------------------------------------------------------*/
184 
185 // - Find all the blocks (a.k.a. chunks) to check.  Mempool chunks require
186 //   some special treatment because they can be within malloc'd blocks.
187 // - Scan every word in the root set (GP registers and valid
188 //   non-heap memory words).
189 //   - First, we skip if it doesn't point to valid memory.
190 //   - Then, we see if it points to the start or interior of a block.  If
191 //     so, we push the block onto the mark stack and mark it as having been
192 //     reached.
193 // - Then, we process the mark stack, repeating the scanning for each block;
194 //   this can push more blocks onto the mark stack.  We repeat until the
195 //   mark stack is empty.  Each block is marked as definitely or possibly
196 //   reachable, depending on whether interior-pointers were required to
197 //   reach it.
198 // - At this point we know for every block if it's reachable or not.
199 // - We then push each unreached block onto the mark stack, using the block
200 //   number as the "clique" number.
201 // - We process the mark stack again, this time grouping blocks into cliques
202 //   in order to facilitate the directly/indirectly lost categorisation.
203 // - We group blocks by their ExeContexts and categorisation, and print them
204 //   if --leak-check=full.  We also print summary numbers.
205 //
206 // A note on "cliques":
207 // - A directly lost block is one with no pointers to it.  An indirectly
208 //   lost block is one that is pointed to by a directly or indirectly lost
209 //   block.
210 // - Each directly lost block has zero or more indirectly lost blocks
211 //   hanging off it.  All these blocks together form a "clique".  The
212 //   directly lost block is called the "clique leader".  The clique number
213 //   is the number (in lc_chunks[]) of the clique leader.
214 // - Actually, a directly lost block may be pointed to if it's part of a
215 //   cycle.  In that case, there may be more than one choice for the clique
216 //   leader, and the choice is arbitrary.  Eg. if you have A-->B and B-->A
217 //   either A or B could be the clique leader.
218 // - Cliques cannot overlap, and will be truncated to avoid this.  Eg. if we
219 //   have A-->C and B-->C, the two cliques will be {A,C} and {B}, or {A} and
220 //   {B,C} (again the choice is arbitrary).  This is because we don't want
221 //   to count a block as indirectly lost more than once.
222 //
223 // A note on 'is_prior_definite':
224 // - This is a boolean used in various places that indicates if the chain
225 //   up to the prior node (prior to the one being considered) is definite.
226 // - In the clique == -1 case:
227 //   - if True it means that the prior node is a root-set node, or that the
228 //     prior node is a block which is reachable from the root-set via
229 //     start-pointers.
230 //   - if False it means that the prior node is a block that is only
231 //     reachable from the root-set via a path including at least one
232 //     interior-pointer.
233 // - In the clique != -1 case, currently it's always True because we treat
234 //   start-pointers and interior-pointers the same for direct/indirect leak
235 //   checking.  If we added a PossibleIndirectLeak state then this would
236 //   change.
237 
238 
239 // Define to debug the memory-leak-detector.
240 #define VG_DEBUG_LEAKCHECK 0
241 #define VG_DEBUG_CLIQUE    0
242 
243 
244 /*------------------------------------------------------------*/
245 /*--- Getting the initial chunks, and searching them.      ---*/
246 /*------------------------------------------------------------*/
247 
248 // Compare the MC_Chunks by 'data' (i.e. the address of the block).
compare_MC_Chunks(const void * n1,const void * n2)249 static Int compare_MC_Chunks(const void* n1, const void* n2)
250 {
251    const MC_Chunk* mc1 = *(const MC_Chunk *const *)n1;
252    const MC_Chunk* mc2 = *(const MC_Chunk *const *)n2;
253    if (mc1->data < mc2->data) return -1;
254    if (mc1->data > mc2->data) return  1;
255    return 0;
256 }
257 
258 #if VG_DEBUG_LEAKCHECK
259 // Used to sanity-check the fast binary-search mechanism.
260 static
find_chunk_for_OLD(Addr ptr,MC_Chunk ** chunks,Int n_chunks)261 Int find_chunk_for_OLD ( Addr       ptr,
262                          MC_Chunk** chunks,
263                          Int        n_chunks )
264 
265 {
266    Int  i;
267    Addr a_lo, a_hi;
268    PROF_EVENT(70, "find_chunk_for_OLD");
269    for (i = 0; i < n_chunks; i++) {
270       PROF_EVENT(71, "find_chunk_for_OLD(loop)");
271       a_lo = chunks[i]->data;
272       a_hi = ((Addr)chunks[i]->data) + chunks[i]->szB;
273       if (a_lo <= ptr && ptr < a_hi)
274          return i;
275    }
276    return -1;
277 }
278 #endif
279 
280 // Find the i such that ptr points at or inside the block described by
281 // chunks[i].  Return -1 if none found.  This assumes that chunks[]
282 // has been sorted on the 'data' field.
283 static
find_chunk_for(Addr ptr,MC_Chunk ** chunks,Int n_chunks)284 Int find_chunk_for ( Addr       ptr,
285                      MC_Chunk** chunks,
286                      Int        n_chunks )
287 {
288    Addr a_mid_lo, a_mid_hi;
289    Int lo, mid, hi, retVal;
290    // VG_(printf)("find chunk for %p = ", ptr);
291    retVal = -1;
292    lo = 0;
293    hi = n_chunks-1;
294    while (True) {
295       // Invariant: current unsearched space is from lo to hi, inclusive.
296       if (lo > hi) break; // not found
297 
298       mid      = (lo + hi) / 2;
299       a_mid_lo = chunks[mid]->data;
300       a_mid_hi = chunks[mid]->data + chunks[mid]->szB;
301       // Extent of block 'mid' is [a_mid_lo .. a_mid_hi).
302       // Special-case zero-sized blocks - treat them as if they had
303       // size 1.  Not doing so causes them to not cover any address
304       // range at all and so will never be identified as the target of
305       // any pointer, which causes them to be incorrectly reported as
306       // definitely leaked.
307       if (chunks[mid]->szB == 0)
308          a_mid_hi++;
309 
310       if (ptr < a_mid_lo) {
311          hi = mid-1;
312          continue;
313       }
314       if (ptr >= a_mid_hi) {
315          lo = mid+1;
316          continue;
317       }
318       tl_assert(ptr >= a_mid_lo && ptr < a_mid_hi);
319       retVal = mid;
320       break;
321    }
322 
323 #  if VG_DEBUG_LEAKCHECK
324    tl_assert(retVal == find_chunk_for_OLD ( ptr, chunks, n_chunks ));
325 #  endif
326    // VG_(printf)("%d\n", retVal);
327    return retVal;
328 }
329 
330 
331 static MC_Chunk**
find_active_chunks(Int * pn_chunks)332 find_active_chunks(Int* pn_chunks)
333 {
334    // Our goal is to construct a set of chunks that includes every
335    // mempool chunk, and every malloc region that *doesn't* contain a
336    // mempool chunk.
337    MC_Mempool *mp;
338    MC_Chunk **mallocs, **chunks, *mc;
339    UInt n_mallocs, n_chunks, m, s;
340    Bool *malloc_chunk_holds_a_pool_chunk;
341 
342    // First we collect all the malloc chunks into an array and sort it.
343    // We do this because we want to query the chunks by interior
344    // pointers, requiring binary search.
345    mallocs = (MC_Chunk**) VG_(HT_to_array)( MC_(malloc_list), &n_mallocs );
346    if (n_mallocs == 0) {
347       tl_assert(mallocs == NULL);
348       *pn_chunks = 0;
349       return NULL;
350    }
351    VG_(ssort)(mallocs, n_mallocs, sizeof(VgHashNode*), compare_MC_Chunks);
352 
353    // Then we build an array containing a Bool for each malloc chunk,
354    // indicating whether it contains any mempools.
355    malloc_chunk_holds_a_pool_chunk = VG_(calloc)( "mc.fas.1",
356                                                   n_mallocs, sizeof(Bool) );
357    n_chunks = n_mallocs;
358 
359    // Then we loop over the mempool tables. For each chunk in each
360    // pool, we set the entry in the Bool array corresponding to the
361    // malloc chunk containing the mempool chunk.
362    VG_(HT_ResetIter)(MC_(mempool_list));
363    while ( (mp = VG_(HT_Next)(MC_(mempool_list))) ) {
364       VG_(HT_ResetIter)(mp->chunks);
365       while ( (mc = VG_(HT_Next)(mp->chunks)) ) {
366 
367          // We'll need to record this chunk.
368          n_chunks++;
369 
370          // Possibly invalidate the malloc holding the beginning of this chunk.
371          m = find_chunk_for(mc->data, mallocs, n_mallocs);
372          if (m != -1 && malloc_chunk_holds_a_pool_chunk[m] == False) {
373             tl_assert(n_chunks > 0);
374             n_chunks--;
375             malloc_chunk_holds_a_pool_chunk[m] = True;
376          }
377 
378          // Possibly invalidate the malloc holding the end of this chunk.
379          if (mc->szB > 1) {
380             m = find_chunk_for(mc->data + (mc->szB - 1), mallocs, n_mallocs);
381             if (m != -1 && malloc_chunk_holds_a_pool_chunk[m] == False) {
382                tl_assert(n_chunks > 0);
383                n_chunks--;
384                malloc_chunk_holds_a_pool_chunk[m] = True;
385             }
386          }
387       }
388    }
389    tl_assert(n_chunks > 0);
390 
391    // Create final chunk array.
392    chunks = VG_(malloc)("mc.fas.2", sizeof(VgHashNode*) * (n_chunks));
393    s = 0;
394 
395    // Copy the mempool chunks and the non-marked malloc chunks into a
396    // combined array of chunks.
397    VG_(HT_ResetIter)(MC_(mempool_list));
398    while ( (mp = VG_(HT_Next)(MC_(mempool_list))) ) {
399       VG_(HT_ResetIter)(mp->chunks);
400       while ( (mc = VG_(HT_Next)(mp->chunks)) ) {
401          tl_assert(s < n_chunks);
402          chunks[s++] = mc;
403       }
404    }
405    for (m = 0; m < n_mallocs; ++m) {
406       if (!malloc_chunk_holds_a_pool_chunk[m]) {
407          tl_assert(s < n_chunks);
408          chunks[s++] = mallocs[m];
409       }
410    }
411    tl_assert(s == n_chunks);
412 
413    // Free temporaries.
414    VG_(free)(mallocs);
415    VG_(free)(malloc_chunk_holds_a_pool_chunk);
416 
417    *pn_chunks = n_chunks;
418 
419    return chunks;
420 }
421 
422 /*------------------------------------------------------------*/
423 /*--- The leak detector proper.                            ---*/
424 /*------------------------------------------------------------*/
425 
426 // Holds extra info about each block during leak checking.
427 typedef
428    struct {
429       UInt  state:2;    // Reachedness.
430       UInt  pending:1;  // Scan pending.
431       UInt  heuristic: (sizeof(UInt)*8)-3;
432       // Heuristic with which this block was considered reachable.
433       // LchNone if state != Reachable or no heuristic needed to
434       // consider it reachable.
435 
436       union {
437          SizeT indirect_szB;
438          // If Unreached, how many bytes are unreachable from here.
439          SizeT  clique;
440          // if IndirectLeak, clique leader to which it belongs.
441       } IorC;
442    }
443    LC_Extra;
444 
445 // An array holding pointers to every chunk we're checking.  Sorted by address.
446 // lc_chunks is initialised during leak search. It is kept after leak search
447 // to support printing the list of blocks belonging to a loss record.
448 // lc_chunk array can only be used validly till the next "free" operation
449 // (as a free operation potentially destroys one or more chunks).
450 // To detect lc_chunk is valid, we store the nr of frees operations done
451 // when lc_chunk was build : lc_chunks (and lc_extras) stays valid as
452 // long as no free operations has been done since lc_chunks building.
453 static MC_Chunk** lc_chunks;
454 // How many chunks we're dealing with.
455 static Int        lc_n_chunks;
456 static SizeT lc_chunks_n_frees_marker;
457 // This has the same number of entries as lc_chunks, and each entry
458 // in lc_chunks corresponds with the entry here (ie. lc_chunks[i] and
459 // lc_extras[i] describe the same block).
460 static LC_Extra* lc_extras;
461 
462 // chunks will be converted and merged in loss record, maintained in lr_table
463 // lr_table elements are kept from one leak_search to another to implement
464 // the "print new/changed leaks" client request
465 static OSet*        lr_table;
466 // Array of sorted loss record (produced during last leak search).
467 static LossRecord** lr_array;
468 
469 // Value of the heuristics parameter used in the current (or last) leak check.
470 static UInt detect_memory_leaks_last_heuristics;
471 
472 // DeltaMode used the last time we called detect_memory_leaks.
473 // The recorded leak errors are output using a logic based on this delta_mode.
474 // The below avoids replicating the delta_mode in each LossRecord.
475 LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
476 
477 // Each leak search run increments the below generation counter.
478 // A used suppression during a leak search will contain this
479 // generation number.
480 UInt MC_(leak_search_gen);
481 
482 // Records chunks that are currently being processed.  Each element in the
483 // stack is an index into lc_chunks and lc_extras.  Its size is
484 // 'lc_n_chunks' because in the worst case that's how many chunks could be
485 // pushed onto it (actually I think the maximum is lc_n_chunks-1 but let's
486 // be conservative).
487 static Int* lc_markstack;
488 // The index of the top element of the stack; -1 if the stack is empty, 0 if
489 // the stack has one element, 1 if it has two, etc.
490 static Int  lc_markstack_top;
491 
492 // Keeps track of how many bytes of memory we've scanned, for printing.
493 // (Nb: We don't keep track of how many register bytes we've scanned.)
494 static SizeT lc_scanned_szB;
495 // Keeps track of how many bytes we have not scanned due to read errors that
496 // caused a signal such as SIGSEGV.
497 static SizeT lc_sig_skipped_szB;
498 
499 
500 SizeT MC_(bytes_leaked)     = 0;
501 SizeT MC_(bytes_indirect)   = 0;
502 SizeT MC_(bytes_dubious)    = 0;
503 SizeT MC_(bytes_reachable)  = 0;
504 SizeT MC_(bytes_suppressed) = 0;
505 
506 SizeT MC_(blocks_leaked)     = 0;
507 SizeT MC_(blocks_indirect)   = 0;
508 SizeT MC_(blocks_dubious)    = 0;
509 SizeT MC_(blocks_reachable)  = 0;
510 SizeT MC_(blocks_suppressed) = 0;
511 
512 // Subset of MC_(bytes_reachable) and MC_(blocks_reachable) which
513 // are considered reachable due to the corresponding heuristic.
514 static SizeT MC_(bytes_heuristically_reachable)[N_LEAK_CHECK_HEURISTICS]
515                                                = {0,0,0,0};
516 static SizeT MC_(blocks_heuristically_reachable)[N_LEAK_CHECK_HEURISTICS]
517                                                 = {0,0,0,0};
518 
519 // Determines if a pointer is to a chunk.  Returns the chunk number et al
520 // via call-by-reference.
521 static Bool
lc_is_a_chunk_ptr(Addr ptr,Int * pch_no,MC_Chunk ** pch,LC_Extra ** pex)522 lc_is_a_chunk_ptr(Addr ptr, Int* pch_no, MC_Chunk** pch, LC_Extra** pex)
523 {
524    Int ch_no;
525    MC_Chunk* ch;
526    LC_Extra* ex;
527 
528    // Quick filter. Note: implemented with am, not with get_vabits2
529    // as ptr might be random data pointing anywhere. On 64 bit
530    // platforms, getting va bits for random data can be quite costly
531    // due to the secondary map.
532    if (!VG_(am_is_valid_for_client)(ptr, 1, VKI_PROT_READ)) {
533       return False;
534    } else {
535       ch_no = find_chunk_for(ptr, lc_chunks, lc_n_chunks);
536       tl_assert(ch_no >= -1 && ch_no < lc_n_chunks);
537 
538       if (ch_no == -1) {
539          return False;
540       } else {
541          // Ok, we've found a pointer to a chunk.  Get the MC_Chunk and its
542          // LC_Extra.
543          ch = lc_chunks[ch_no];
544          ex = &(lc_extras[ch_no]);
545 
546          tl_assert(ptr >= ch->data);
547          tl_assert(ptr < ch->data + ch->szB + (ch->szB==0  ? 1  : 0));
548 
549          if (VG_DEBUG_LEAKCHECK)
550             VG_(printf)("ptr=%#lx -> block %d\n", ptr, ch_no);
551 
552          *pch_no = ch_no;
553          *pch    = ch;
554          *pex    = ex;
555 
556          return True;
557       }
558    }
559 }
560 
561 // Push a chunk (well, just its index) onto the mark stack.
lc_push(Int ch_no,MC_Chunk * ch)562 static void lc_push(Int ch_no, MC_Chunk* ch)
563 {
564    if (!lc_extras[ch_no].pending) {
565       if (0) {
566          VG_(printf)("pushing %#lx-%#lx\n", ch->data, ch->data + ch->szB);
567       }
568       lc_markstack_top++;
569       tl_assert(lc_markstack_top < lc_n_chunks);
570       lc_markstack[lc_markstack_top] = ch_no;
571       tl_assert(!lc_extras[ch_no].pending);
572       lc_extras[ch_no].pending = True;
573    }
574 }
575 
576 // Return the index of the chunk on the top of the mark stack, or -1 if
577 // there isn't one.
lc_pop(Int * ret)578 static Bool lc_pop(Int* ret)
579 {
580    if (-1 == lc_markstack_top) {
581       return False;
582    } else {
583       tl_assert(0 <= lc_markstack_top && lc_markstack_top < lc_n_chunks);
584       *ret = lc_markstack[lc_markstack_top];
585       lc_markstack_top--;
586       tl_assert(lc_extras[*ret].pending);
587       lc_extras[*ret].pending = False;
588       return True;
589    }
590 }
591 
pp_heuristic(LeakCheckHeuristic h)592 static const HChar* pp_heuristic(LeakCheckHeuristic h)
593 {
594    switch(h) {
595    case LchNone:                return "none";
596    case LchStdString:           return "stdstring";
597    case LchNewArray:            return "newarray";
598    case LchMultipleInheritance: return "multipleinheritance";
599    default:                     return "???invalid heuristic???";
600    }
601 }
602 
603 // True if ptr looks like the address of a vtable, i.e. if ptr
604 // points to an array of pointers to functions.
605 // It is assumed the only caller of this function is heuristic_reachedness
606 // which must check that ptr is aligned and above page 0.
607 // Checking that ptr is above page 0 is an optimisation : it is assumed
608 // that no vtable is located in the page 0. So, all small integer values
609 // encountered during the scan will not incur the cost of calling this
610 // function.
aligned_ptr_above_page0_is_vtable_addr(Addr ptr)611 static Bool aligned_ptr_above_page0_is_vtable_addr(Addr ptr)
612 {
613    // ??? If performance problem:
614    // ??? maybe implement a cache (array indexed by ptr % primenr)
615    // ??? of "I am a vtable ptr" ???
616 
617    // ??? Maybe the debug info could (efficiently?) be used to detect vtables ?
618 
619    // We consider ptr as a vtable ptr if it points to a table
620    // where we find only NULL pointers or pointers pointing at an
621    // executable region. We must find at least 2 non NULL pointers
622    // before considering ptr as a vtable pointer.
623    // We scan a maximum of VTABLE_MAX_CHECK words for these 2 non NULL
624    // pointers.
625 #define VTABLE_MAX_CHECK 20
626 
627    NSegment const *seg;
628    UInt nr_fn_ptrs = 0;
629    Addr scan;
630    Addr scan_max;
631 
632    // First verify ptr points inside a client mapped file section.
633    // ??? is a vtable always in a file mapped readable section ?
634    seg = VG_(am_find_nsegment) (ptr);
635    if (seg == NULL
636        || seg->kind != SkFileC
637        || !seg->hasR)
638       return False;
639 
640    // Check potential function pointers, up to a maximum of VTABLE_MAX_CHECK.
641    scan_max = ptr + VTABLE_MAX_CHECK*sizeof(Addr);
642    // If ptr is near the end of seg, avoid scan_max exceeding the end of seg:
643    if (scan_max > seg->end - sizeof(Addr))
644       scan_max = seg->end - sizeof(Addr);
645    for (scan = ptr; scan <= scan_max; scan+=sizeof(Addr)) {
646       Addr pot_fn = *((Addr *)scan);
647       if (pot_fn == 0)
648          continue; // NULL fn pointer. Seems it can happen in vtable.
649       seg = VG_(am_find_nsegment) (pot_fn);
650 #if defined(VGA_ppc64)
651       // ppc64 use a thunk table. So, we have one more level of indirection
652       // to follow.
653       if (seg == NULL
654           || seg->kind != SkFileC
655           || !seg->hasR
656           || !seg->hasW)
657          return False; // ptr to nowhere, or not a ptr to thunks.
658       pot_fn = *((Addr *)pot_fn);
659       if (pot_fn == 0)
660          continue; // NULL fn pointer. Seems it can happen in vtable.
661       seg = VG_(am_find_nsegment) (pot_fn);
662 #endif
663       if (seg == NULL
664           || seg->kind != SkFileC
665           || !seg->hasT)
666          return False; // ptr to nowhere, or not a fn ptr.
667       nr_fn_ptrs++;
668       if (nr_fn_ptrs == 2)
669          return True;
670    }
671 
672    return False;
673 }
674 
675 // If ch is heuristically reachable via an heuristic member of heur_set,
676 // returns this heuristic.
677 // If ch cannot be considered reachable using one of these heuristics,
678 // return LchNone.
679 // This should only be called when ptr is an interior ptr to ch.
680 // The StdString/NewArray/MultipleInheritance heuristics are directly
681 // inspired from DrMemory:
682 //  see http://www.burningcutlery.com/derek/docs/drmem-CGO11.pdf [section VI,C]
683 //  and bug 280271.
heuristic_reachedness(Addr ptr,MC_Chunk * ch,LC_Extra * ex,UInt heur_set)684 static LeakCheckHeuristic heuristic_reachedness (Addr ptr,
685                                                  MC_Chunk *ch, LC_Extra *ex,
686                                                  UInt heur_set)
687 {
688    if (HiS(LchStdString, heur_set)) {
689       // Detects inner pointers to Std::String for layout being
690       //     length capacity refcount char_array[] \0
691       // where ptr points to the beginning of the char_array.
692       // Note: we check definedness for length and capacity but
693       // not for refcount, as refcount size might be smaller than
694       // a SizeT, giving a uninitialised hole in the first 3 SizeT.
695       if ( ptr == ch->data + 3 * sizeof(SizeT)
696            && MC_(is_valid_aligned_word)(ch->data + sizeof(SizeT))) {
697          const SizeT capacity = *((SizeT*)(ch->data + sizeof(SizeT)));
698          if (3 * sizeof(SizeT) + capacity + 1 == ch->szB
699             && MC_(is_valid_aligned_word)(ch->data)) {
700             const SizeT length = *((SizeT*)ch->data);
701             if (length <= capacity) {
702                // ??? could check there is no null byte from ptr to ptr+length-1
703                // ???    and that there is a null byte at ptr+length.
704                // ???
705                // ??? could check that ch->allockind is MC_AllocNew ???
706                // ??? probably not a good idea, as I guess stdstring
707                // ??? allocator can be done via custom allocator
708                // ??? or even a call to malloc ????
709                return LchStdString;
710             }
711          }
712       }
713    }
714 
715    if (HiS(LchNewArray, heur_set)) {
716       // Detects inner pointers at second word of new[] array, following
717       // a plausible nr of elements.
718       // Such inner pointers are used for arrays of elements
719       // having a destructor, as the delete[] of the array must know
720       // how many elements to destroy.
721       //
722       // We have a strange/wrong case for 'ptr = new MyClass[0];' :
723       // For such a case, the returned ptr points just outside the
724       // allocated chunk. This chunk is then seen as a definite
725       // leak by Valgrind, as it is not considered an interior pointer.
726       // It is the c++ equivalent of bug 99923 (malloc(0) wrongly considered
727       // as definitely leaked). See the trick in find_chunk_for handling
728       // 0-sized block. This trick does not work for 'new MyClass[0]'
729       // because a chunk "word-sized" is allocated to store the (0) nr
730       // of elements.
731       if ( ptr == ch->data + sizeof(SizeT)
732            && MC_(is_valid_aligned_word)(ch->data)) {
733          const SizeT nr_elts = *((SizeT*)ch->data);
734          if (nr_elts > 0 && (ch->szB - sizeof(SizeT)) % nr_elts == 0) {
735             // ??? could check that ch->allockind is MC_AllocNewVec ???
736             return LchNewArray;
737          }
738       }
739    }
740 
741    if (HiS(LchMultipleInheritance, heur_set)) {
742       // Detect inner pointer used for multiple inheritance.
743       // Assumption is that the vtable pointers are before the object.
744       if (VG_IS_WORD_ALIGNED(ptr)
745           && MC_(is_valid_aligned_word)(ptr)) {
746          Addr first_addr;
747          Addr inner_addr;
748 
749          // Avoid the call to is_vtable_addr when the addr is not
750          // aligned or points in the page0, as it is unlikely
751          // a vtable is located in this page. This last optimisation
752          // avoids to call aligned_ptr_above_page0_is_vtable_addr
753          // for all small integers.
754          // Note: we could possibly also avoid calling this function
755          // for small negative integers, as no vtable should be located
756          // in the last page.
757          inner_addr = *((Addr*)ptr);
758          if (VG_IS_WORD_ALIGNED(inner_addr)
759              && inner_addr >= (Addr)VKI_PAGE_SIZE
760              && MC_(is_valid_aligned_word)(ch->data)) {
761             first_addr = *((Addr*)ch->data);
762             if (VG_IS_WORD_ALIGNED(first_addr)
763                 && first_addr >= (Addr)VKI_PAGE_SIZE
764                 && aligned_ptr_above_page0_is_vtable_addr(inner_addr)
765                 && aligned_ptr_above_page0_is_vtable_addr(first_addr)) {
766                // ??? could check that ch->allockind is MC_AllocNew ???
767                return LchMultipleInheritance;
768             }
769          }
770       }
771    }
772 
773    return LchNone;
774 }
775 
776 
777 // If 'ptr' is pointing to a heap-allocated block which hasn't been seen
778 // before, push it onto the mark stack.
779 static void
lc_push_without_clique_if_a_chunk_ptr(Addr ptr,Bool is_prior_definite)780 lc_push_without_clique_if_a_chunk_ptr(Addr ptr, Bool is_prior_definite)
781 {
782    Int ch_no;
783    MC_Chunk* ch;
784    LC_Extra* ex;
785    Reachedness ch_via_ptr; // Is ch reachable via ptr, and how ?
786 
787    if ( ! lc_is_a_chunk_ptr(ptr, &ch_no, &ch, &ex) )
788       return;
789 
790    if (ex->state == Reachable) {
791       if (ex->heuristic && ptr == ch->data)
792          // If block was considered reachable via an heuristic, and it is now
793          // directly reachable via ptr, clear the heuristic field.
794          ex->heuristic = LchNone;
795       return;
796    }
797 
798    // Possibly upgrade the state, ie. one of:
799    // - Unreached --> Possible
800    // - Unreached --> Reachable
801    // - Possible  --> Reachable
802 
803    if (ptr == ch->data)
804       ch_via_ptr = Reachable;
805    else if (detect_memory_leaks_last_heuristics) {
806       ex->heuristic
807          = heuristic_reachedness (ptr, ch, ex,
808                                   detect_memory_leaks_last_heuristics);
809       if (ex->heuristic)
810          ch_via_ptr = Reachable;
811       else
812          ch_via_ptr = Possible;
813    } else
814       ch_via_ptr = Possible;
815 
816    if (ch_via_ptr == Reachable && is_prior_definite) {
817       // 'ptr' points to the start of the block or is to be considered as
818       // pointing to the start of the block, and the prior node is
819       // definite, which means that this block is definitely reachable.
820       ex->state = Reachable;
821 
822       // State has changed to Reachable so (re)scan the block to make
823       // sure any blocks it points to are correctly marked.
824       lc_push(ch_no, ch);
825 
826    } else if (ex->state == Unreached) {
827       // Either 'ptr' is a interior-pointer, or the prior node isn't definite,
828       // which means that we can only mark this block as possibly reachable.
829       ex->state = Possible;
830 
831       // State has changed to Possible so (re)scan the block to make
832       // sure any blocks it points to are correctly marked.
833       lc_push(ch_no, ch);
834    }
835 }
836 
837 static void
lc_push_if_a_chunk_ptr_register(ThreadId tid,const HChar * regname,Addr ptr)838 lc_push_if_a_chunk_ptr_register(ThreadId tid, const HChar* regname, Addr ptr)
839 {
840    lc_push_without_clique_if_a_chunk_ptr(ptr, /*is_prior_definite*/True);
841 }
842 
843 // If ptr is pointing to a heap-allocated block which hasn't been seen
844 // before, push it onto the mark stack.  Clique is the index of the
845 // clique leader.
846 static void
lc_push_with_clique_if_a_chunk_ptr(Addr ptr,Int clique,Int cur_clique)847 lc_push_with_clique_if_a_chunk_ptr(Addr ptr, Int clique, Int cur_clique)
848 {
849    Int ch_no;
850    MC_Chunk* ch;
851    LC_Extra* ex;
852 
853    tl_assert(0 <= clique && clique < lc_n_chunks);
854 
855    if ( ! lc_is_a_chunk_ptr(ptr, &ch_no, &ch, &ex) )
856       return;
857 
858    // If it's not Unreached, it's already been handled so ignore it.
859    // If ch_no==clique, it's the clique leader, which means this is a cyclic
860    // structure;  again ignore it because it's already been handled.
861    if (ex->state == Unreached && ch_no != clique) {
862       // Note that, unlike reachable blocks, we currently don't distinguish
863       // between start-pointers and interior-pointers here.  We probably
864       // should, though.
865       lc_push(ch_no, ch);
866 
867       // Add the block to the clique, and add its size to the
868       // clique-leader's indirect size.  Also, if the new block was
869       // itself a clique leader, it isn't any more, so add its
870       // indirect_szB to the new clique leader.
871       if (VG_DEBUG_CLIQUE) {
872          if (ex->IorC.indirect_szB > 0)
873             VG_(printf)("  clique %d joining clique %d adding %lu+%lu\n",
874                         ch_no, clique, (unsigned long)ch->szB,
875 			(unsigned long)ex->IorC.indirect_szB);
876          else
877             VG_(printf)("  block %d joining clique %d adding %lu\n",
878                         ch_no, clique, (unsigned long)ch->szB);
879       }
880 
881       lc_extras[clique].IorC.indirect_szB += ch->szB;
882       lc_extras[clique].IorC.indirect_szB += ex->IorC.indirect_szB;
883       ex->state = IndirectLeak;
884       ex->IorC.clique = (SizeT) cur_clique;
885    }
886 }
887 
888 static void
lc_push_if_a_chunk_ptr(Addr ptr,Int clique,Int cur_clique,Bool is_prior_definite)889 lc_push_if_a_chunk_ptr(Addr ptr,
890                        Int clique, Int cur_clique, Bool is_prior_definite)
891 {
892    if (-1 == clique)
893       lc_push_without_clique_if_a_chunk_ptr(ptr, is_prior_definite);
894    else
895       lc_push_with_clique_if_a_chunk_ptr(ptr, clique, cur_clique);
896 }
897 
898 
899 static VG_MINIMAL_JMP_BUF(memscan_jmpbuf);
900 static volatile Addr bad_scanned_addr;
901 
902 static
scan_all_valid_memory_catcher(Int sigNo,Addr addr)903 void scan_all_valid_memory_catcher ( Int sigNo, Addr addr )
904 {
905    if (0)
906       VG_(printf)("OUCH! sig=%d addr=%#lx\n", sigNo, addr);
907    if (sigNo == VKI_SIGSEGV || sigNo == VKI_SIGBUS) {
908       bad_scanned_addr = addr;
909       VG_MINIMAL_LONGJMP(memscan_jmpbuf);
910    }
911 }
912 
913 // lc_scan_memory has 2 modes:
914 //
915 // 1. Leak check mode (searched == 0).
916 // -----------------------------------
917 // Scan a block of memory between [start, start+len).  This range may
918 // be bogus, inaccessable, or otherwise strange; we deal with it.  For each
919 // valid aligned word we assume it's a pointer to a chunk a push the chunk
920 // onto the mark stack if so.
921 // clique is the "highest level clique" in which indirectly leaked blocks have
922 // to be collected. cur_clique is the current "lower" level clique through which
923 // the memory to be scanned has been found.
924 // Example: in the below tree if A is leaked, the top level clique will
925 //   be A, while lower level cliques will be B and C.
926 /*
927            A
928          /   \
929         B     C
930        / \   / \
931       D   E F   G
932 */
933 // Proper handling of top and lowest level clique allows block_list of a loss
934 // record to describe the hierarchy of indirectly leaked blocks.
935 //
936 // 2. Search ptr mode (searched != 0).
937 // -----------------------------------
938 // In this mode, searches for pointers to a specific address range
939 // In such a case, lc_scan_memory just scans [start..start+len[ for pointers
940 // to searched and outputs the places where searched is found.
941 // It does not recursively scans the found memory.
942 static void
lc_scan_memory(Addr start,SizeT len,Bool is_prior_definite,Int clique,Int cur_clique,Addr searched,SizeT szB)943 lc_scan_memory(Addr start, SizeT len, Bool is_prior_definite,
944                Int clique, Int cur_clique,
945                Addr searched, SizeT szB)
946 {
947    /* memory scan is based on the assumption that valid pointers are aligned
948       on a multiple of sizeof(Addr). So, we can (and must) skip the begin and
949       end portions of the block if they are not aligned on sizeof(Addr):
950       These cannot be a valid pointer, and calls to MC_(is_valid_aligned_word)
951       will assert for a non aligned address. */
952 #if defined(VGA_s390x)
953    // Define ptr as volatile, as on this platform, the value of ptr
954    // is read in code executed via a longjmp.
955    volatile
956 #endif
957    Addr ptr = VG_ROUNDUP(start, sizeof(Addr));
958    const Addr end = VG_ROUNDDN(start+len, sizeof(Addr));
959    vki_sigset_t sigmask;
960 
961    if (VG_DEBUG_LEAKCHECK)
962       VG_(printf)("scan %#lx-%#lx (%lu)\n", start, end, len);
963 
964    VG_(sigprocmask)(VKI_SIG_SETMASK, NULL, &sigmask);
965    VG_(set_fault_catcher)(scan_all_valid_memory_catcher);
966 
967    /* Optimisation: the loop below will check for each begin
968       of SM chunk if the chunk is fully unaddressable. The idea is to
969       skip efficiently such fully unaddressable SM chunks.
970       So, we preferrably start the loop on a chunk boundary.
971       If the chunk is not fully unaddressable, we might be in
972       an unaddressable page. Again, the idea is to skip efficiently
973       such unaddressable page : this is the "else" part.
974       We use an "else" so that two consecutive fully unaddressable
975       SM chunks will be skipped efficiently: first one is skipped
976       by this piece of code. The next SM chunk will be skipped inside
977       the loop. */
978    if ( ! MC_(is_within_valid_secondary)(ptr) ) {
979       // Skip an invalid SM chunk till the beginning of the next SM Chunk.
980       ptr = VG_ROUNDUP(ptr+1, SM_SIZE);
981    } else if (!VG_(am_is_valid_for_client)(ptr, sizeof(Addr), VKI_PROT_READ)) {
982       // else we are in a (at least partially) valid SM chunk.
983       // We might be in the middle of an unreadable page.
984       // Do a cheap check to see if it's valid;
985       // if not, skip onto the next page.
986       ptr = VG_PGROUNDUP(ptr+1);        // First page is bad - skip it.
987    }
988    /* The above optimisation and below loop is based on some relationships
989       between VKI_PAGE_SIZE, SM_SIZE and sizeof(Addr) which are asserted in
990       MC_(detect_memory_leaks). */
991 
992    // During scan, we check with aspacemgr that each page is readable and
993    // belongs to client.
994    // We still protect against SIGSEGV and SIGBUS e.g. in case aspacemgr is
995    // desynchronised with the real page mappings.
996    // Such a desynchronisation could happen due to an aspacemgr bug.
997    // Note that if the application is using mprotect(NONE), then
998    // a page can be unreadable but have addressable and defined
999    // VA bits (see mc_main.c function mc_new_mem_mprotect).
1000    if (VG_MINIMAL_SETJMP(memscan_jmpbuf) != 0) {
1001       // Catch read error ...
1002       // We need to restore the signal mask, because we were
1003       // longjmped out of a signal handler.
1004       VG_(sigprocmask)(VKI_SIG_SETMASK, &sigmask, NULL);
1005 #     if defined(VGA_s390x)
1006       // For a SIGSEGV, s390 delivers the page address of the bad address.
1007       // For a SIGBUS, old s390 kernels deliver a NULL address.
1008       // bad_scanned_addr can thus not be used.
1009       // So, on this platform, we always skip a full page from ptr.
1010       // The below implies to mark ptr as volatile, as we read the value
1011       // after a longjmp to here.
1012       lc_sig_skipped_szB += VKI_PAGE_SIZE;
1013       ptr = ptr + VKI_PAGE_SIZE; // Unaddressable, - skip it.
1014 #     else
1015       // On other platforms, just skip one Addr.
1016       lc_sig_skipped_szB += sizeof(Addr);
1017       tl_assert(bad_scanned_addr >= VG_ROUNDUP(start, sizeof(Addr)));
1018       tl_assert(bad_scanned_addr < VG_ROUNDDN(start+len, sizeof(Addr)));
1019       ptr = bad_scanned_addr + sizeof(Addr); // Unaddressable, - skip it.
1020 #endif
1021    }
1022    while (ptr < end) {
1023       Addr addr;
1024 
1025       // Skip invalid chunks.
1026       if (UNLIKELY((ptr % SM_SIZE) == 0)) {
1027          if (! MC_(is_within_valid_secondary)(ptr) ) {
1028             ptr = VG_ROUNDUP(ptr+1, SM_SIZE);
1029             continue;
1030          }
1031       }
1032 
1033       // Look to see if this page seems reasonable.
1034       if (UNLIKELY((ptr % VKI_PAGE_SIZE) == 0)) {
1035          if (!VG_(am_is_valid_for_client)(ptr, sizeof(Addr), VKI_PROT_READ)) {
1036             ptr += VKI_PAGE_SIZE;      // Bad page - skip it.
1037             continue;
1038          }
1039       }
1040 
1041       if ( MC_(is_valid_aligned_word)(ptr) ) {
1042          lc_scanned_szB += sizeof(Addr);
1043          // If the below read fails, we will longjmp to the loop begin.
1044          addr = *(Addr *)ptr;
1045          // If we get here, the scanned word is in valid memory.  Now
1046          // let's see if its contents point to a chunk.
1047          if (UNLIKELY(searched)) {
1048             if (addr >= searched && addr < searched + szB) {
1049                if (addr == searched) {
1050                   VG_(umsg)("*%#lx points at %#lx\n", ptr, searched);
1051                   MC_(pp_describe_addr) (ptr);
1052                } else {
1053                   Int ch_no;
1054                   MC_Chunk *ch;
1055                   LC_Extra *ex;
1056                   VG_(umsg)("*%#lx interior points at %lu bytes inside %#lx\n",
1057                             ptr, (long unsigned) addr - searched, searched);
1058                   MC_(pp_describe_addr) (ptr);
1059                   if (lc_is_a_chunk_ptr(addr, &ch_no, &ch, &ex) ) {
1060                      Int h;
1061                      for (h = LchStdString; h <= LchMultipleInheritance; h++) {
1062                         if (heuristic_reachedness(addr, ch, ex, H2S(h)) == h) {
1063                            VG_(umsg)("block at %#lx considered reachable "
1064                                      "by ptr %#lx using %s heuristic\n",
1065                                      ch->data, addr, pp_heuristic(h));
1066                         }
1067                      }
1068                      // Verify the loop above has properly scanned all
1069                      // heuristics. If the below fails, it probably means the
1070                      // LeakCheckHeuristic enum is not in sync anymore with the
1071                      // above loop and/or with N_LEAK_CHECK_HEURISTICS.
1072                      tl_assert (h == N_LEAK_CHECK_HEURISTICS);
1073                   }
1074                }
1075             }
1076          } else {
1077             lc_push_if_a_chunk_ptr(addr, clique, cur_clique, is_prior_definite);
1078          }
1079       } else if (0 && VG_DEBUG_LEAKCHECK) {
1080          VG_(printf)("%#lx not valid\n", ptr);
1081       }
1082       ptr += sizeof(Addr);
1083    }
1084 
1085    VG_(sigprocmask)(VKI_SIG_SETMASK, &sigmask, NULL);
1086    VG_(set_fault_catcher)(NULL);
1087 }
1088 
1089 
1090 // Process the mark stack until empty.
lc_process_markstack(Int clique)1091 static void lc_process_markstack(Int clique)
1092 {
1093    Int  top = -1;    // shut gcc up
1094    Bool is_prior_definite;
1095 
1096    while (lc_pop(&top)) {
1097       tl_assert(top >= 0 && top < lc_n_chunks);
1098 
1099       // See comment about 'is_prior_definite' at the top to understand this.
1100       is_prior_definite = ( Possible != lc_extras[top].state );
1101 
1102       lc_scan_memory(lc_chunks[top]->data, lc_chunks[top]->szB,
1103                      is_prior_definite, clique, (clique == -1 ? -1 : top),
1104                      /*searched*/ 0, 0);
1105    }
1106 }
1107 
cmp_LossRecordKey_LossRecord(const void * key,const void * elem)1108 static Word cmp_LossRecordKey_LossRecord(const void* key, const void* elem)
1109 {
1110    const LossRecordKey* a = key;
1111    const LossRecordKey* b = &(((const LossRecord*)elem)->key);
1112 
1113    // Compare on states first because that's fast.
1114    if (a->state < b->state) return -1;
1115    if (a->state > b->state) return  1;
1116    // Ok, the states are equal.  Now compare the locations, which is slower.
1117    if (VG_(eq_ExeContext)(
1118             MC_(clo_leak_resolution), a->allocated_at, b->allocated_at))
1119       return 0;
1120    // Different locations.  Ordering is arbitrary, just use the ec pointer.
1121    if (a->allocated_at < b->allocated_at) return -1;
1122    if (a->allocated_at > b->allocated_at) return  1;
1123    VG_(tool_panic)("bad LossRecord comparison");
1124 }
1125 
cmp_LossRecords(const void * va,const void * vb)1126 static Int cmp_LossRecords(const void* va, const void* vb)
1127 {
1128    const LossRecord* lr_a = *(const LossRecord *const *)va;
1129    const LossRecord* lr_b = *(const LossRecord *const *)vb;
1130    SizeT total_szB_a = lr_a->szB + lr_a->indirect_szB;
1131    SizeT total_szB_b = lr_b->szB + lr_b->indirect_szB;
1132 
1133    // First compare by sizes.
1134    if (total_szB_a < total_szB_b) return -1;
1135    if (total_szB_a > total_szB_b) return  1;
1136    // If size are equal, compare by states.
1137    if (lr_a->key.state < lr_b->key.state) return -1;
1138    if (lr_a->key.state > lr_b->key.state) return  1;
1139    // If they're still equal here, it doesn't matter that much, but we keep
1140    // comparing other things so that regtests are as deterministic as
1141    // possible.  So:  compare num_blocks.
1142    if (lr_a->num_blocks < lr_b->num_blocks) return -1;
1143    if (lr_a->num_blocks > lr_b->num_blocks) return  1;
1144    // Finally, compare ExeContext addresses... older ones are likely to have
1145    // lower addresses.
1146    if (lr_a->key.allocated_at < lr_b->key.allocated_at) return -1;
1147    if (lr_a->key.allocated_at > lr_b->key.allocated_at) return  1;
1148    return 0;
1149 }
1150 
1151 // allocates or reallocates lr_array, and set its elements to the loss records
1152 // contains in lr_table.
get_lr_array_from_lr_table(void)1153 static Int get_lr_array_from_lr_table(void) {
1154    Int          i, n_lossrecords;
1155    LossRecord*  lr;
1156 
1157    n_lossrecords = VG_(OSetGen_Size)(lr_table);
1158 
1159    // (re-)create the array of pointers to the loss records.
1160    // lr_array is kept to allow producing the block list from gdbserver.
1161    if (lr_array != NULL)
1162       VG_(free)(lr_array);
1163    lr_array = VG_(malloc)("mc.pr.2", n_lossrecords * sizeof(LossRecord*));
1164    i = 0;
1165    VG_(OSetGen_ResetIter)(lr_table);
1166    while ( (lr = VG_(OSetGen_Next)(lr_table)) ) {
1167       lr_array[i++] = lr;
1168    }
1169    tl_assert(i == n_lossrecords);
1170    return n_lossrecords;
1171 }
1172 
1173 
get_printing_rules(LeakCheckParams * lcp,LossRecord * lr,Bool * count_as_error,Bool * print_record)1174 static void get_printing_rules(LeakCheckParams* lcp,
1175                                LossRecord*  lr,
1176                                Bool* count_as_error,
1177                                Bool* print_record)
1178 {
1179    // Rules for printing:
1180    // - We don't show suppressed loss records ever (and that's controlled
1181    //   within the error manager).
1182    // - We show non-suppressed loss records that are specified in
1183    //   --show-leak-kinds=... if --leak-check=yes.
1184 
1185    Bool delta_considered;
1186 
1187    switch (lcp->deltamode) {
1188    case LCD_Any:
1189       delta_considered = lr->num_blocks > 0;
1190       break;
1191    case LCD_Increased:
1192       delta_considered
1193          = lr->szB > lr->old_szB
1194          || lr->indirect_szB > lr->old_indirect_szB
1195          || lr->num_blocks > lr->old_num_blocks;
1196       break;
1197    case LCD_Changed:
1198       delta_considered = lr->szB != lr->old_szB
1199          || lr->indirect_szB != lr->old_indirect_szB
1200          || lr->num_blocks != lr->old_num_blocks;
1201       break;
1202    default:
1203       tl_assert(0);
1204    }
1205 
1206    *print_record = lcp->mode == LC_Full && delta_considered
1207       && RiS(lr->key.state,lcp->show_leak_kinds);
1208    // We don't count a leaks as errors with lcp->mode==LC_Summary.
1209    // Otherwise you can get high error counts with few or no error
1210    // messages, which can be confusing.  Otherwise, we count as errors
1211    // the leak kinds requested by --errors-for-leak-kinds=...
1212    *count_as_error = lcp->mode == LC_Full && delta_considered
1213       && RiS(lr->key.state,lcp->errors_for_leak_kinds);
1214 }
1215 
print_results(ThreadId tid,LeakCheckParams * lcp)1216 static void print_results(ThreadId tid, LeakCheckParams* lcp)
1217 {
1218    Int          i, n_lossrecords, start_lr_output_scan;
1219    LossRecord*  lr;
1220    Bool         is_suppressed;
1221    /* old_* variables are used to report delta in summary.  */
1222    SizeT        old_bytes_leaked      = MC_(bytes_leaked);
1223    SizeT        old_bytes_indirect    = MC_(bytes_indirect);
1224    SizeT        old_bytes_dubious     = MC_(bytes_dubious);
1225    SizeT        old_bytes_reachable   = MC_(bytes_reachable);
1226    SizeT        old_bytes_suppressed  = MC_(bytes_suppressed);
1227    SizeT        old_blocks_leaked     = MC_(blocks_leaked);
1228    SizeT        old_blocks_indirect   = MC_(blocks_indirect);
1229    SizeT        old_blocks_dubious    = MC_(blocks_dubious);
1230    SizeT        old_blocks_reachable  = MC_(blocks_reachable);
1231    SizeT        old_blocks_suppressed = MC_(blocks_suppressed);
1232 
1233    SizeT old_bytes_heuristically_reachable[N_LEAK_CHECK_HEURISTICS];
1234    SizeT old_blocks_heuristically_reachable[N_LEAK_CHECK_HEURISTICS];
1235 
1236    for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++) {
1237       old_bytes_heuristically_reachable[i]
1238          =  MC_(bytes_heuristically_reachable)[i];
1239       MC_(bytes_heuristically_reachable)[i] = 0;
1240       old_blocks_heuristically_reachable[i]
1241          =  MC_(blocks_heuristically_reachable)[i];
1242       MC_(blocks_heuristically_reachable)[i] = 0;
1243    }
1244 
1245    if (lr_table == NULL)
1246       // Create the lr_table, which holds the loss records.
1247       // If the lr_table already exists, it means it contains
1248       // loss_records from the previous leak search. The old_*
1249       // values in these records are used to implement the
1250       // leak check delta mode
1251       lr_table =
1252          VG_(OSetGen_Create)(offsetof(LossRecord, key),
1253                              cmp_LossRecordKey_LossRecord,
1254                              VG_(malloc), "mc.pr.1",
1255                              VG_(free));
1256 
1257    // If we have loss records from a previous search, reset values to have
1258    // proper printing of the deltas between previous search and this search.
1259    n_lossrecords = get_lr_array_from_lr_table();
1260    for (i = 0; i < n_lossrecords; i++) {
1261       if (lr_array[i]->num_blocks == 0) {
1262          // remove from lr_table the old loss_records with 0 bytes found
1263          VG_(OSetGen_Remove) (lr_table, &lr_array[i]->key);
1264          VG_(OSetGen_FreeNode)(lr_table, lr_array[i]);
1265       } else {
1266          // move the leak sizes to old_* and zero the current sizes
1267          // for next leak search
1268          lr_array[i]->old_szB          = lr_array[i]->szB;
1269          lr_array[i]->old_indirect_szB = lr_array[i]->indirect_szB;
1270          lr_array[i]->old_num_blocks   = lr_array[i]->num_blocks;
1271          lr_array[i]->szB              = 0;
1272          lr_array[i]->indirect_szB     = 0;
1273          lr_array[i]->num_blocks       = 0;
1274       }
1275    }
1276    // lr_array now contains "invalid" loss records => free it.
1277    // lr_array will be re-created below with the kept and new loss records.
1278    VG_(free) (lr_array);
1279    lr_array = NULL;
1280 
1281    // Convert the chunks into loss records, merging them where appropriate.
1282    for (i = 0; i < lc_n_chunks; i++) {
1283       MC_Chunk*     ch = lc_chunks[i];
1284       LC_Extra*     ex = &(lc_extras)[i];
1285       LossRecord*   old_lr;
1286       LossRecordKey lrkey;
1287       lrkey.state        = ex->state;
1288       lrkey.allocated_at = MC_(allocated_at)(ch);
1289 
1290      if (ex->heuristic) {
1291         MC_(bytes_heuristically_reachable)[ex->heuristic] += ch->szB;
1292         MC_(blocks_heuristically_reachable)[ex->heuristic]++;
1293         if (VG_DEBUG_LEAKCHECK)
1294            VG_(printf)("heuristic %s %#lx len %lu\n",
1295                        pp_heuristic(ex->heuristic),
1296                        ch->data, (unsigned long)ch->szB);
1297      }
1298 
1299       old_lr = VG_(OSetGen_Lookup)(lr_table, &lrkey);
1300       if (old_lr) {
1301          // We found an existing loss record matching this chunk.  Update the
1302          // loss record's details in-situ.  This is safe because we don't
1303          // change the elements used as the OSet key.
1304          old_lr->szB          += ch->szB;
1305          if (ex->state == Unreached)
1306             old_lr->indirect_szB += ex->IorC.indirect_szB;
1307          old_lr->num_blocks++;
1308       } else {
1309          // No existing loss record matches this chunk.  Create a new loss
1310          // record, initialise it from the chunk, and insert it into lr_table.
1311          lr = VG_(OSetGen_AllocNode)(lr_table, sizeof(LossRecord));
1312          lr->key              = lrkey;
1313          lr->szB              = ch->szB;
1314          if (ex->state == Unreached)
1315             lr->indirect_szB     = ex->IorC.indirect_szB;
1316          else
1317             lr->indirect_szB     = 0;
1318          lr->num_blocks       = 1;
1319          lr->old_szB          = 0;
1320          lr->old_indirect_szB = 0;
1321          lr->old_num_blocks   = 0;
1322          VG_(OSetGen_Insert)(lr_table, lr);
1323       }
1324    }
1325 
1326    // (re-)create the array of pointers to the (new) loss records.
1327    n_lossrecords = get_lr_array_from_lr_table ();
1328    tl_assert(VG_(OSetGen_Size)(lr_table) == n_lossrecords);
1329 
1330    // Sort the array by loss record sizes.
1331    VG_(ssort)(lr_array, n_lossrecords, sizeof(LossRecord*),
1332               cmp_LossRecords);
1333 
1334    // Zero totals.
1335    MC_(blocks_leaked)     = MC_(bytes_leaked)     = 0;
1336    MC_(blocks_indirect)   = MC_(bytes_indirect)   = 0;
1337    MC_(blocks_dubious)    = MC_(bytes_dubious)    = 0;
1338    MC_(blocks_reachable)  = MC_(bytes_reachable)  = 0;
1339    MC_(blocks_suppressed) = MC_(bytes_suppressed) = 0;
1340 
1341    // If there is a maximum nr of loss records we can output, then first
1342    // compute from where the output scan has to start.
1343    // By default, start from the first loss record. Compute a higher
1344    // value if there is a maximum to respect. We need to print the last
1345    // records, as the one with the biggest sizes are more interesting.
1346    start_lr_output_scan = 0;
1347    if (lcp->mode == LC_Full && lcp->max_loss_records_output < n_lossrecords) {
1348       Int nr_printable_records = 0;
1349       for (i = n_lossrecords - 1; i >= 0 && start_lr_output_scan == 0; i--) {
1350          Bool count_as_error, print_record;
1351          lr = lr_array[i];
1352          get_printing_rules (lcp, lr, &count_as_error, &print_record);
1353          // Do not use get_printing_rules results for is_suppressed, as we
1354          // only want to check if the record would be suppressed.
1355          is_suppressed =
1356             MC_(record_leak_error) ( tid, i+1, n_lossrecords, lr,
1357                                      False /* print_record */,
1358                                      False /* count_as_error */);
1359          if (print_record && !is_suppressed) {
1360             nr_printable_records++;
1361             if (nr_printable_records == lcp->max_loss_records_output)
1362                start_lr_output_scan = i;
1363          }
1364       }
1365    }
1366 
1367    // Print the loss records (in size order) and collect summary stats.
1368    for (i = start_lr_output_scan; i < n_lossrecords; i++) {
1369       Bool count_as_error, print_record;
1370       lr = lr_array[i];
1371       get_printing_rules(lcp, lr, &count_as_error, &print_record);
1372       is_suppressed =
1373          MC_(record_leak_error) ( tid, i+1, n_lossrecords, lr, print_record,
1374                                   count_as_error );
1375 
1376       if (is_suppressed) {
1377          MC_(blocks_suppressed) += lr->num_blocks;
1378          MC_(bytes_suppressed)  += lr->szB;
1379 
1380       } else if (Unreached == lr->key.state) {
1381          MC_(blocks_leaked)     += lr->num_blocks;
1382          MC_(bytes_leaked)      += lr->szB;
1383 
1384       } else if (IndirectLeak == lr->key.state) {
1385          MC_(blocks_indirect)   += lr->num_blocks;
1386          MC_(bytes_indirect)    += lr->szB;
1387 
1388       } else if (Possible == lr->key.state) {
1389          MC_(blocks_dubious)    += lr->num_blocks;
1390          MC_(bytes_dubious)     += lr->szB;
1391 
1392       } else if (Reachable == lr->key.state) {
1393          MC_(blocks_reachable)  += lr->num_blocks;
1394          MC_(bytes_reachable)   += lr->szB;
1395 
1396       } else {
1397          VG_(tool_panic)("unknown loss mode");
1398       }
1399    }
1400 
1401    if (VG_(clo_verbosity) > 0 && !VG_(clo_xml)) {
1402       HChar d_bytes[20];
1403       HChar d_blocks[20];
1404 #     define DBY(new,old) \
1405       MC_(snprintf_delta) (d_bytes, 20, (new), (old), lcp->deltamode)
1406 #     define DBL(new,old) \
1407       MC_(snprintf_delta) (d_blocks, 20, (new), (old), lcp->deltamode)
1408 
1409       VG_(umsg)("LEAK SUMMARY:\n");
1410       VG_(umsg)("   definitely lost: %'lu%s bytes in %'lu%s blocks\n",
1411                 MC_(bytes_leaked),
1412                 DBY (MC_(bytes_leaked), old_bytes_leaked),
1413                 MC_(blocks_leaked),
1414                 DBL (MC_(blocks_leaked), old_blocks_leaked));
1415       VG_(umsg)("   indirectly lost: %'lu%s bytes in %'lu%s blocks\n",
1416                 MC_(bytes_indirect),
1417                 DBY (MC_(bytes_indirect), old_bytes_indirect),
1418                 MC_(blocks_indirect),
1419                 DBL (MC_(blocks_indirect), old_blocks_indirect));
1420       VG_(umsg)("     possibly lost: %'lu%s bytes in %'lu%s blocks\n",
1421                 MC_(bytes_dubious),
1422                 DBY (MC_(bytes_dubious), old_bytes_dubious),
1423                 MC_(blocks_dubious),
1424                 DBL (MC_(blocks_dubious), old_blocks_dubious));
1425       VG_(umsg)("   still reachable: %'lu%s bytes in %'lu%s blocks\n",
1426                 MC_(bytes_reachable),
1427                 DBY (MC_(bytes_reachable), old_bytes_reachable),
1428                 MC_(blocks_reachable),
1429                 DBL (MC_(blocks_reachable), old_blocks_reachable));
1430       for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++)
1431          if (old_blocks_heuristically_reachable[i] > 0
1432              || MC_(blocks_heuristically_reachable)[i] > 0) {
1433             VG_(umsg)("                      of which "
1434                       "reachable via heuristic:\n");
1435             break;
1436          }
1437       for (i = 0; i < N_LEAK_CHECK_HEURISTICS; i++)
1438          if (old_blocks_heuristically_reachable[i] > 0
1439              || MC_(blocks_heuristically_reachable)[i] > 0)
1440             VG_(umsg)("                        %19s: "
1441                       "%'lu%s bytes in %'lu%s blocks\n",
1442                       pp_heuristic(i),
1443                       MC_(bytes_heuristically_reachable)[i],
1444                       DBY (MC_(bytes_heuristically_reachable)[i],
1445                            old_bytes_heuristically_reachable[i]),
1446                       MC_(blocks_heuristically_reachable)[i],
1447                       DBL (MC_(blocks_heuristically_reachable)[i],
1448                            old_blocks_heuristically_reachable[i]));
1449       VG_(umsg)("        suppressed: %'lu%s bytes in %'lu%s blocks\n",
1450                 MC_(bytes_suppressed),
1451                 DBY (MC_(bytes_suppressed), old_bytes_suppressed),
1452                 MC_(blocks_suppressed),
1453                 DBL (MC_(blocks_suppressed), old_blocks_suppressed));
1454       if (lcp->mode != LC_Full &&
1455           (MC_(blocks_leaked) + MC_(blocks_indirect) +
1456            MC_(blocks_dubious) + MC_(blocks_reachable)) > 0) {
1457          if (lcp->requested_by_monitor_command)
1458             VG_(umsg)("To see details of leaked memory, "
1459                       "give 'full' arg to leak_check\n");
1460          else
1461             VG_(umsg)("Rerun with --leak-check=full to see details "
1462                       "of leaked memory\n");
1463       }
1464       if (lcp->mode == LC_Full &&
1465           MC_(blocks_reachable) > 0 && !RiS(Reachable,lcp->show_leak_kinds)) {
1466          VG_(umsg)("Reachable blocks (those to which a pointer "
1467                    "was found) are not shown.\n");
1468          if (lcp->requested_by_monitor_command)
1469             VG_(umsg)("To see them, add 'reachable any' args to leak_check\n");
1470          else
1471             VG_(umsg)("To see them, rerun with: --leak-check=full "
1472                       "--show-leak-kinds=all\n");
1473       }
1474       VG_(umsg)("\n");
1475       #undef DBL
1476       #undef DBY
1477    }
1478 }
1479 
1480 // print recursively all indirectly leaked blocks collected in clique.
print_clique(Int clique,UInt level)1481 static void print_clique (Int clique, UInt level)
1482 {
1483    Int ind;
1484    Int i,  n_lossrecords;;
1485 
1486    n_lossrecords = VG_(OSetGen_Size)(lr_table);
1487 
1488    for (ind = 0; ind < lc_n_chunks; ind++) {
1489       LC_Extra*     ind_ex = &(lc_extras)[ind];
1490       if (ind_ex->state == IndirectLeak
1491           && ind_ex->IorC.clique == (SizeT) clique) {
1492          MC_Chunk*    ind_ch = lc_chunks[ind];
1493          LossRecord*  ind_lr;
1494          LossRecordKey ind_lrkey;
1495          Int lr_i;
1496          ind_lrkey.state = ind_ex->state;
1497          ind_lrkey.allocated_at = MC_(allocated_at)(ind_ch);
1498          ind_lr = VG_(OSetGen_Lookup)(lr_table, &ind_lrkey);
1499          for (lr_i = 0; lr_i < n_lossrecords; lr_i++)
1500             if (ind_lr == lr_array[lr_i])
1501                break;
1502          for (i = 0; i < level; i++)
1503             VG_(umsg)("  ");
1504          VG_(umsg)("%p[%lu] indirect loss record %d\n",
1505                    (void *)ind_ch->data, (unsigned long)ind_ch->szB,
1506                    lr_i+1); // lr_i+1 for user numbering.
1507          if (lr_i >= n_lossrecords)
1508             VG_(umsg)
1509                ("error: no indirect loss record found for %p[%lu]?????\n",
1510                 (void *)ind_ch->data, (unsigned long)ind_ch->szB);
1511          print_clique(ind, level+1);
1512       }
1513    }
1514  }
1515 
MC_(print_block_list)1516 Bool MC_(print_block_list) ( UInt loss_record_nr)
1517 {
1518    Int          i,  n_lossrecords;
1519    LossRecord*  lr;
1520 
1521    if (lr_table == NULL || lc_chunks == NULL || lc_extras == NULL) {
1522       VG_(umsg)("Can't print block list : no valid leak search result\n");
1523       return False;
1524    }
1525 
1526    if (lc_chunks_n_frees_marker != MC_(get_cmalloc_n_frees)()) {
1527       VG_(umsg)("Can't print obsolete block list : redo a leak search first\n");
1528       return False;
1529    }
1530 
1531    n_lossrecords = VG_(OSetGen_Size)(lr_table);
1532    if (loss_record_nr >= n_lossrecords)
1533       return False; // Invalid loss record nr.
1534 
1535    tl_assert (lr_array);
1536    lr = lr_array[loss_record_nr];
1537 
1538    // (re-)print the loss record details.
1539    // (+1 on loss_record_nr as user numbering for loss records starts at 1).
1540    MC_(pp_LossRecord)(loss_record_nr+1, n_lossrecords, lr);
1541 
1542    // Match the chunks with loss records.
1543    for (i = 0; i < lc_n_chunks; i++) {
1544       MC_Chunk*     ch = lc_chunks[i];
1545       LC_Extra*     ex = &(lc_extras)[i];
1546       LossRecord*   old_lr;
1547       LossRecordKey lrkey;
1548       lrkey.state        = ex->state;
1549       lrkey.allocated_at = MC_(allocated_at)(ch);
1550 
1551       old_lr = VG_(OSetGen_Lookup)(lr_table, &lrkey);
1552       if (old_lr) {
1553          // We found an existing loss record matching this chunk.
1554          // If this is the loss record we are looking for, output the pointer.
1555          if (old_lr == lr_array[loss_record_nr]) {
1556             VG_(umsg)("%p[%lu]\n",
1557                       (void *)ch->data, (unsigned long) ch->szB);
1558             if (ex->state != Reachable) {
1559                // We can print the clique in all states, except Reachable.
1560                // In Unreached state, lc_chunk[i] is the clique leader.
1561                // In IndirectLeak, lc_chunk[i] might have been a clique leader
1562                // which was later collected in another clique.
1563                // For Possible, lc_chunk[i] might be the top of a clique
1564                // or an intermediate clique.
1565                print_clique(i, 1);
1566             }
1567          }
1568       } else {
1569          // No existing loss record matches this chunk ???
1570          VG_(umsg)("error: no loss record found for %p[%lu]?????\n",
1571                    (void *)ch->data, (unsigned long) ch->szB);
1572       }
1573    }
1574    return True;
1575 }
1576 
1577 // If searched = 0, scan memory root set, pushing onto the mark stack the blocks
1578 // encountered.
1579 // Otherwise (searched != 0), scan the memory root set searching for ptr
1580 // pointing inside [searched, searched+szB[.
scan_memory_root_set(Addr searched,SizeT szB)1581 static void scan_memory_root_set(Addr searched, SizeT szB)
1582 {
1583    Int   i;
1584    Int   n_seg_starts;
1585    Addr* seg_starts = VG_(get_segment_starts)( &n_seg_starts );
1586 
1587    tl_assert(seg_starts && n_seg_starts > 0);
1588 
1589    lc_scanned_szB = 0;
1590    lc_sig_skipped_szB = 0;
1591 
1592    // VG_(am_show_nsegments)( 0, "leakcheck");
1593    for (i = 0; i < n_seg_starts; i++) {
1594       SizeT seg_size;
1595       NSegment const* seg = VG_(am_find_nsegment)( seg_starts[i] );
1596       tl_assert(seg);
1597 
1598       if (seg->kind != SkFileC && seg->kind != SkAnonC) continue;
1599       if (!(seg->hasR && seg->hasW))                    continue;
1600       if (seg->isCH)                                    continue;
1601 
1602       // Don't poke around in device segments as this may cause
1603       // hangs.  Exclude /dev/zero just in case someone allocated
1604       // memory by explicitly mapping /dev/zero.
1605       if (seg->kind == SkFileC
1606           && (VKI_S_ISCHR(seg->mode) || VKI_S_ISBLK(seg->mode))) {
1607          HChar* dev_name = VG_(am_get_filename)( seg );
1608          if (dev_name && 0 == VG_(strcmp)(dev_name, "/dev/zero")) {
1609             // Don't skip /dev/zero.
1610          } else {
1611             // Skip this device mapping.
1612             continue;
1613          }
1614       }
1615 
1616       if (0)
1617          VG_(printf)("ACCEPT %2d  %#lx %#lx\n", i, seg->start, seg->end);
1618 
1619       // Scan the segment.  We use -1 for the clique number, because this
1620       // is a root-set.
1621       seg_size = seg->end - seg->start + 1;
1622       if (VG_(clo_verbosity) > 2) {
1623          VG_(message)(Vg_DebugMsg,
1624                       "  Scanning root segment: %#lx..%#lx (%lu)\n",
1625                       seg->start, seg->end, seg_size);
1626       }
1627       lc_scan_memory(seg->start, seg_size, /*is_prior_definite*/True,
1628                      /*clique*/-1, /*cur_clique*/-1,
1629                      searched, szB);
1630    }
1631    VG_(free)(seg_starts);
1632 }
1633 
1634 /*------------------------------------------------------------*/
1635 /*--- Top-level entry point.                               ---*/
1636 /*------------------------------------------------------------*/
1637 
MC_(detect_memory_leaks)1638 void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams* lcp)
1639 {
1640    Int i, j;
1641 
1642    tl_assert(lcp->mode != LC_Off);
1643 
1644    // Verify some assertions which are used in lc_scan_memory.
1645    tl_assert((VKI_PAGE_SIZE % sizeof(Addr)) == 0);
1646    tl_assert((SM_SIZE % sizeof(Addr)) == 0);
1647    // Above two assertions are critical, while below assertion
1648    // ensures that the optimisation in the loop is done in the
1649    // correct order : the loop checks for (big) SM chunk skipping
1650    // before checking for (smaller) page skipping.
1651    tl_assert((SM_SIZE % VKI_PAGE_SIZE) == 0);
1652 
1653    MC_(leak_search_gen)++;
1654    MC_(detect_memory_leaks_last_delta_mode) = lcp->deltamode;
1655    detect_memory_leaks_last_heuristics = lcp->heuristics;
1656 
1657    // Get the chunks, stop if there were none.
1658    if (lc_chunks) {
1659       VG_(free)(lc_chunks);
1660       lc_chunks = NULL;
1661    }
1662    lc_chunks = find_active_chunks(&lc_n_chunks);
1663    lc_chunks_n_frees_marker = MC_(get_cmalloc_n_frees)();
1664    if (lc_n_chunks == 0) {
1665       tl_assert(lc_chunks == NULL);
1666       if (lr_table != NULL) {
1667          // forget the previous recorded LossRecords as next leak search
1668          // can in any case just create new leaks.
1669          // Maybe it would be better to rather call print_result ?
1670          // (at least when leak decreases are requested)
1671          // This will then output all LossRecords with a size decreasing to 0
1672          VG_(OSetGen_Destroy) (lr_table);
1673          lr_table = NULL;
1674       }
1675       if (VG_(clo_verbosity) >= 1 && !VG_(clo_xml)) {
1676          VG_(umsg)("All heap blocks were freed -- no leaks are possible\n");
1677          VG_(umsg)("\n");
1678       }
1679       return;
1680    }
1681 
1682    // Sort the array so blocks are in ascending order in memory.
1683    VG_(ssort)(lc_chunks, lc_n_chunks, sizeof(VgHashNode*), compare_MC_Chunks);
1684 
1685    // Sanity check -- make sure they're in order.
1686    for (i = 0; i < lc_n_chunks-1; i++) {
1687       tl_assert( lc_chunks[i]->data <= lc_chunks[i+1]->data);
1688    }
1689 
1690    // Sanity check -- make sure they don't overlap.  The one exception is that
1691    // we allow a MALLOCLIKE block to sit entirely within a malloc() block.
1692    // This is for bug 100628.  If this occurs, we ignore the malloc() block
1693    // for leak-checking purposes.  This is a hack and probably should be done
1694    // better, but at least it's consistent with mempools (which are treated
1695    // like this in find_active_chunks).  Mempools have a separate VgHashTable
1696    // for mempool chunks, but if custom-allocated blocks are put in a separate
1697    // table from normal heap blocks it makes free-mismatch checking more
1698    // difficult.
1699    //
1700    // If this check fails, it probably means that the application
1701    // has done something stupid with VALGRIND_MALLOCLIKE_BLOCK client
1702    // requests, eg. has made overlapping requests (which are
1703    // nonsensical), or used VALGRIND_MALLOCLIKE_BLOCK for stack locations;
1704    // again nonsensical.
1705    //
1706    for (i = 0; i < lc_n_chunks-1; i++) {
1707       MC_Chunk* ch1 = lc_chunks[i];
1708       MC_Chunk* ch2 = lc_chunks[i+1];
1709 
1710       Addr start1    = ch1->data;
1711       Addr start2    = ch2->data;
1712       Addr end1      = ch1->data + ch1->szB - 1;
1713       Addr end2      = ch2->data + ch2->szB - 1;
1714       Bool isCustom1 = ch1->allockind == MC_AllocCustom;
1715       Bool isCustom2 = ch2->allockind == MC_AllocCustom;
1716 
1717       if (end1 < start2) {
1718          // Normal case - no overlap.
1719 
1720       // We used to allow exact duplicates, I'm not sure why.  --njn
1721       //} else if (start1 == start2 && end1 == end2) {
1722          // Degenerate case: exact duplicates.
1723 
1724       } else if (start1 >= start2 && end1 <= end2 && isCustom1 && !isCustom2) {
1725          // Block i is MALLOCLIKE and entirely within block i+1.
1726          // Remove block i+1.
1727          for (j = i+1; j < lc_n_chunks-1; j++) {
1728             lc_chunks[j] = lc_chunks[j+1];
1729          }
1730          lc_n_chunks--;
1731 
1732       } else if (start2 >= start1 && end2 <= end1 && isCustom2 && !isCustom1) {
1733          // Block i+1 is MALLOCLIKE and entirely within block i.
1734          // Remove block i.
1735          for (j = i; j < lc_n_chunks-1; j++) {
1736             lc_chunks[j] = lc_chunks[j+1];
1737          }
1738          lc_n_chunks--;
1739 
1740       } else {
1741          VG_(umsg)("Block 0x%lx..0x%lx overlaps with block 0x%lx..0x%lx\n",
1742                    start1, end1, start2, end2);
1743          VG_(umsg)("Blocks allocation contexts:\n"),
1744          VG_(pp_ExeContext)( MC_(allocated_at)(ch1));
1745          VG_(umsg)("\n"),
1746          VG_(pp_ExeContext)(  MC_(allocated_at)(ch2));
1747          VG_(umsg)("This is usually caused by using VALGRIND_MALLOCLIKE_BLOCK");
1748          VG_(umsg)("in an inappropriate way.\n");
1749          tl_assert (0);
1750       }
1751    }
1752 
1753    // Initialise lc_extras.
1754    if (lc_extras) {
1755       VG_(free)(lc_extras);
1756       lc_extras = NULL;
1757    }
1758    lc_extras = VG_(malloc)( "mc.dml.2", lc_n_chunks * sizeof(LC_Extra) );
1759    for (i = 0; i < lc_n_chunks; i++) {
1760       lc_extras[i].state        = Unreached;
1761       lc_extras[i].pending      = False;
1762       lc_extras[i].heuristic = LchNone;
1763       lc_extras[i].IorC.indirect_szB = 0;
1764    }
1765 
1766    // Initialise lc_markstack.
1767    lc_markstack = VG_(malloc)( "mc.dml.2", lc_n_chunks * sizeof(Int) );
1768    for (i = 0; i < lc_n_chunks; i++) {
1769       lc_markstack[i] = -1;
1770    }
1771    lc_markstack_top = -1;
1772 
1773    // Verbosity.
1774    if (VG_(clo_verbosity) > 1 && !VG_(clo_xml)) {
1775       VG_(umsg)( "Searching for pointers to %'d not-freed blocks\n",
1776                  lc_n_chunks );
1777    }
1778 
1779    // Scan the memory root-set, pushing onto the mark stack any blocks
1780    // pointed to.
1781    scan_memory_root_set(/*searched*/0, 0);
1782 
1783    // Scan GP registers for chunk pointers.
1784    VG_(apply_to_GP_regs)(lc_push_if_a_chunk_ptr_register);
1785 
1786    // Process the pushed blocks.  After this, every block that is reachable
1787    // from the root-set has been traced.
1788    lc_process_markstack(/*clique*/-1);
1789 
1790    if (VG_(clo_verbosity) > 1 && !VG_(clo_xml)) {
1791       VG_(umsg)("Checked %'lu bytes\n", lc_scanned_szB);
1792       if (lc_sig_skipped_szB > 0)
1793          VG_(umsg)("Skipped %'lu bytes due to read errors\n",
1794                    lc_sig_skipped_szB);
1795       VG_(umsg)( "\n" );
1796    }
1797 
1798    // Trace all the leaked blocks to determine which are directly leaked and
1799    // which are indirectly leaked.  For each Unreached block, push it onto
1800    // the mark stack, and find all the as-yet-Unreached blocks reachable
1801    // from it.  These form a clique and are marked IndirectLeak, and their
1802    // size is added to the clique leader's indirect size.  If one of the
1803    // found blocks was itself a clique leader (from a previous clique), then
1804    // the cliques are merged.
1805    for (i = 0; i < lc_n_chunks; i++) {
1806       MC_Chunk* ch = lc_chunks[i];
1807       LC_Extra* ex = &(lc_extras[i]);
1808 
1809       if (VG_DEBUG_CLIQUE)
1810          VG_(printf)("cliques: %d at %#lx -> Loss state %d\n",
1811                      i, ch->data, ex->state);
1812 
1813       tl_assert(lc_markstack_top == -1);
1814 
1815       if (ex->state == Unreached) {
1816          if (VG_DEBUG_CLIQUE)
1817             VG_(printf)("%d: gathering clique %#lx\n", i, ch->data);
1818 
1819          // Push this Unreached block onto the stack and process it.
1820          lc_push(i, ch);
1821          lc_process_markstack(/*clique*/i);
1822 
1823          tl_assert(lc_markstack_top == -1);
1824          tl_assert(ex->state == Unreached);
1825       }
1826    }
1827 
1828    print_results( tid, lcp);
1829 
1830    VG_(free) ( lc_markstack );
1831    lc_markstack = NULL;
1832    // lc_chunks, lc_extras, lr_array and lr_table are kept (needed if user
1833    // calls MC_(print_block_list)). lr_table also used for delta leak reporting
1834    // between this leak search and the next leak search.
1835 }
1836 
1837 static Addr searched_wpa;
1838 static SizeT searched_szB;
1839 static void
search_address_in_GP_reg(ThreadId tid,const HChar * regname,Addr addr_in_reg)1840 search_address_in_GP_reg(ThreadId tid, const HChar* regname, Addr addr_in_reg)
1841 {
1842    if (addr_in_reg >= searched_wpa
1843        && addr_in_reg < searched_wpa + searched_szB) {
1844       if (addr_in_reg == searched_wpa)
1845          VG_(umsg)
1846             ("tid %d register %s pointing at %#lx\n",
1847              tid, regname, searched_wpa);
1848       else
1849          VG_(umsg)
1850             ("tid %d register %s interior pointing %lu bytes inside %#lx\n",
1851              tid, regname, (long unsigned) addr_in_reg - searched_wpa,
1852              searched_wpa);
1853    }
1854 }
1855 
MC_(who_points_at)1856 void MC_(who_points_at) ( Addr address, SizeT szB)
1857 {
1858    MC_Chunk** chunks;
1859    Int        n_chunks;
1860    Int        i;
1861 
1862    if (szB == 1)
1863       VG_(umsg) ("Searching for pointers to %#lx\n", address);
1864    else
1865       VG_(umsg) ("Searching for pointers pointing in %lu bytes from %#lx\n",
1866                  szB, address);
1867 
1868    chunks = find_active_chunks(&n_chunks);
1869 
1870    // Scan memory root-set, searching for ptr pointing in address[szB]
1871    scan_memory_root_set(address, szB);
1872 
1873    // Scan active malloc-ed chunks
1874    for (i = 0; i < n_chunks; i++) {
1875       lc_scan_memory(chunks[i]->data, chunks[i]->szB,
1876                      /*is_prior_definite*/True,
1877                      /*clique*/-1, /*cur_clique*/-1,
1878                      address, szB);
1879    }
1880    VG_(free) ( chunks );
1881 
1882    // Scan GP registers for pointers to address range.
1883    searched_wpa = address;
1884    searched_szB = szB;
1885    VG_(apply_to_GP_regs)(search_address_in_GP_reg);
1886 
1887 }
1888 
1889 /*--------------------------------------------------------------------*/
1890 /*--- end                                                          ---*/
1891 /*--------------------------------------------------------------------*/
1892 
1893