Home | History | Annotate | Download | only in memcheck
      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-2012 Julian Seward
     11       jseward (at) 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 //
    124 // ----
    125 //
    126 // Also, the VALGRIND_LEAK_CHECK and VALGRIND_QUICK_LEAK_CHECK aren't great
    127 // names.  VALGRIND_FULL_LEAK_CHECK and VALGRIND_SUMMARY_LEAK_CHECK would be
    128 // better.
    129 //
    130 // ----
    131 //
    132 // Also, VALGRIND_COUNT_LEAKS and VALGRIND_COUNT_LEAK_BLOCKS aren't great as
    133 // they combine direct leaks and indirect leaks into one.  New, more precise
    134 // ones (they'll need new names) would be good.  If more categories are
    135 // used, as per the --follow-interior-pointers option, they should be
    136 // updated accordingly.  And they should use a struct to return the values.
    137 //
    138 // ----
    139 //
    140 // Also, for this case:
    141 //
    142 //  (4)  p4      BBB ---> AAA
    143 //
    144 // BBB is definitely directly lost.  AAA is definitely indirectly lost.
    145 // Here's the relevant loss records printed for a full check (each block is
    146 // 16 bytes):
    147 //
    148 // ==20397== 16 bytes in 1 blocks are indirectly lost in loss record 9 of 15
    149 // ==20397==    at 0x4C2694E: malloc (vg_replace_malloc.c:177)
    150 // ==20397==    by 0x400521: mk (leak-cases.c:49)
    151 // ==20397==    by 0x400578: main (leak-cases.c:72)
    152 //
    153 // ==20397== 32 (16 direct, 16 indirect) bytes in 1 blocks are definitely
    154 // lost in loss record 14 of 15
    155 // ==20397==    at 0x4C2694E: malloc (vg_replace_malloc.c:177)
    156 // ==20397==    by 0x400521: mk (leak-cases.c:49)
    157 // ==20397==    by 0x400580: main (leak-cases.c:72)
    158 //
    159 // The first one is fine -- it describes AAA.
    160 //
    161 // The second one is for BBB.  It's correct in that 16 bytes in 1 block are
    162 // directly lost. It's also correct that 16 are indirectly lost as a result,
    163 // but it means that AAA is being counted twice in the loss records.  (It's
    164 // not, thankfully, counted twice in the summary counts).  Argh.
    165 //
    166 // This would be less confusing for the second one:
    167 //
    168 // ==20397== 16 bytes in 1 blocks are definitely lost in loss record 14
    169 // of 15 (and 16 bytes in 1 block are indirectly lost as a result;  they
    170 // are mentioned elsewhere (if --show-reachable=yes is given!))
    171 // ==20397==    at 0x4C2694E: malloc (vg_replace_malloc.c:177)
    172 // ==20397==    by 0x400521: mk (leak-cases.c:49)
    173 // ==20397==    by 0x400580: main (leak-cases.c:72)
    174 //
    175 // But ideally we'd present the loss record for the directly lost block and
    176 // then the resultant indirectly lost blocks and make it clear the
    177 // dependence.  Double argh.
    178 
    179 /*------------------------------------------------------------*/
    180 /*--- The actual algorithm.                                ---*/
    181 /*------------------------------------------------------------*/
    182 
    183 // - Find all the blocks (a.k.a. chunks) to check.  Mempool chunks require
    184 //   some special treatment because they can be within malloc'd blocks.
    185 // - Scan every word in the root set (GP registers and valid
    186 //   non-heap memory words).
    187 //   - First, we skip if it doesn't point to valid memory.
    188 //   - Then, we see if it points to the start or interior of a block.  If
    189 //     so, we push the block onto the mark stack and mark it as having been
    190 //     reached.
    191 // - Then, we process the mark stack, repeating the scanning for each block;
    192 //   this can push more blocks onto the mark stack.  We repeat until the
    193 //   mark stack is empty.  Each block is marked as definitely or possibly
    194 //   reachable, depending on whether interior-pointers were required to
    195 //   reach it.
    196 // - At this point we know for every block if it's reachable or not.
    197 // - We then push each unreached block onto the mark stack, using the block
    198 //   number as the "clique" number.
    199 // - We process the mark stack again, this time grouping blocks into cliques
    200 //   in order to facilitate the directly/indirectly lost categorisation.
    201 // - We group blocks by their ExeContexts and categorisation, and print them
    202 //   if --leak-check=full.  We also print summary numbers.
    203 //
    204 // A note on "cliques":
    205 // - A directly lost block is one with no pointers to it.  An indirectly
    206 //   lost block is one that is pointed to by a directly or indirectly lost
    207 //   block.
    208 // - Each directly lost block has zero or more indirectly lost blocks
    209 //   hanging off it.  All these blocks together form a "clique".  The
    210 //   directly lost block is called the "clique leader".  The clique number
    211 //   is the number (in lc_chunks[]) of the clique leader.
    212 // - Actually, a directly lost block may be pointed to if it's part of a
    213 //   cycle.  In that case, there may be more than one choice for the clique
    214 //   leader, and the choice is arbitrary.  Eg. if you have A-->B and B-->A
    215 //   either A or B could be the clique leader.
    216 // - Cliques cannot overlap, and will be truncated to avoid this.  Eg. if we
    217 //   have A-->C and B-->C, the two cliques will be {A,C} and {B}, or {A} and
    218 //   {B,C} (again the choice is arbitrary).  This is because we don't want
    219 //   to count a block as indirectly lost more than once.
    220 //
    221 // A note on 'is_prior_definite':
    222 // - This is a boolean used in various places that indicates if the chain
    223 //   up to the prior node (prior to the one being considered) is definite.
    224 // - In the clique == -1 case:
    225 //   - if True it means that the prior node is a root-set node, or that the
    226 //     prior node is a block which is reachable from the root-set via
    227 //     start-pointers.
    228 //   - if False it means that the prior node is a block that is only
    229 //     reachable from the root-set via a path including at least one
    230 //     interior-pointer.
    231 // - In the clique != -1 case, currently it's always True because we treat
    232 //   start-pointers and interior-pointers the same for direct/indirect leak
    233 //   checking.  If we added a PossibleIndirectLeak state then this would
    234 //   change.
    235 
    236 
    237 // Define to debug the memory-leak-detector.
    238 #define VG_DEBUG_LEAKCHECK 0
    239 #define VG_DEBUG_CLIQUE    0
    240 
    241 
    242 /*------------------------------------------------------------*/
    243 /*--- Getting the initial chunks, and searching them.      ---*/
    244 /*------------------------------------------------------------*/
    245 
    246 // Compare the MC_Chunks by 'data' (i.e. the address of the block).
    247 static Int compare_MC_Chunks(void* n1, void* n2)
    248 {
    249    MC_Chunk* mc1 = *(MC_Chunk**)n1;
    250    MC_Chunk* mc2 = *(MC_Chunk**)n2;
    251    if (mc1->data < mc2->data) return -1;
    252    if (mc1->data > mc2->data) return  1;
    253    return 0;
    254 }
    255 
    256 #if VG_DEBUG_LEAKCHECK
    257 // Used to sanity-check the fast binary-search mechanism.
    258 static
    259 Int find_chunk_for_OLD ( Addr       ptr,
    260                          MC_Chunk** chunks,
    261                          Int        n_chunks )
    262 
    263 {
    264    Int  i;
    265    Addr a_lo, a_hi;
    266    PROF_EVENT(70, "find_chunk_for_OLD");
    267    for (i = 0; i < n_chunks; i++) {
    268       PROF_EVENT(71, "find_chunk_for_OLD(loop)");
    269       a_lo = chunks[i]->data;
    270       a_hi = ((Addr)chunks[i]->data) + chunks[i]->szB;
    271       if (a_lo <= ptr && ptr < a_hi)
    272          return i;
    273    }
    274    return -1;
    275 }
    276 #endif
    277 
    278 // Find the i such that ptr points at or inside the block described by
    279 // chunks[i].  Return -1 if none found.  This assumes that chunks[]
    280 // has been sorted on the 'data' field.
    281 static
    282 Int find_chunk_for ( Addr       ptr,
    283                      MC_Chunk** chunks,
    284                      Int        n_chunks )
    285 {
    286    Addr a_mid_lo, a_mid_hi;
    287    Int lo, mid, hi, retVal;
    288    // VG_(printf)("find chunk for %p = ", ptr);
    289    retVal = -1;
    290    lo = 0;
    291    hi = n_chunks-1;
    292    while (True) {
    293       // Invariant: current unsearched space is from lo to hi, inclusive.
    294       if (lo > hi) break; // not found
    295 
    296       mid      = (lo + hi) / 2;
    297       a_mid_lo = chunks[mid]->data;
    298       a_mid_hi = chunks[mid]->data + chunks[mid]->szB;
    299       // Extent of block 'mid' is [a_mid_lo .. a_mid_hi).
    300       // Special-case zero-sized blocks - treat them as if they had
    301       // size 1.  Not doing so causes them to not cover any address
    302       // range at all and so will never be identified as the target of
    303       // any pointer, which causes them to be incorrectly reported as
    304       // definitely leaked.
    305       if (chunks[mid]->szB == 0)
    306          a_mid_hi++;
    307 
    308       if (ptr < a_mid_lo) {
    309          hi = mid-1;
    310          continue;
    311       }
    312       if (ptr >= a_mid_hi) {
    313          lo = mid+1;
    314          continue;
    315       }
    316       tl_assert(ptr >= a_mid_lo && ptr < a_mid_hi);
    317       retVal = mid;
    318       break;
    319    }
    320 
    321 #  if VG_DEBUG_LEAKCHECK
    322    tl_assert(retVal == find_chunk_for_OLD ( ptr, chunks, n_chunks ));
    323 #  endif
    324    // VG_(printf)("%d\n", retVal);
    325    return retVal;
    326 }
    327 
    328 
    329 static MC_Chunk**
    330 find_active_chunks(UInt* pn_chunks)
    331 {
    332    // Our goal is to construct a set of chunks that includes every
    333    // mempool chunk, and every malloc region that *doesn't* contain a
    334    // mempool chunk.
    335    MC_Mempool *mp;
    336    MC_Chunk **mallocs, **chunks, *mc;
    337    UInt n_mallocs, n_chunks, m, s;
    338    Bool *malloc_chunk_holds_a_pool_chunk;
    339 
    340    // First we collect all the malloc chunks into an array and sort it.
    341    // We do this because we want to query the chunks by interior
    342    // pointers, requiring binary search.
    343    mallocs = (MC_Chunk**) VG_(HT_to_array)( MC_(malloc_list), &n_mallocs );
    344    if (n_mallocs == 0) {
    345       tl_assert(mallocs == NULL);
    346       *pn_chunks = 0;
    347       return NULL;
    348    }
    349    VG_(ssort)(mallocs, n_mallocs, sizeof(VgHashNode*), compare_MC_Chunks);
    350 
    351    // Then we build an array containing a Bool for each malloc chunk,
    352    // indicating whether it contains any mempools.
    353    malloc_chunk_holds_a_pool_chunk = VG_(calloc)( "mc.fas.1",
    354                                                   n_mallocs, sizeof(Bool) );
    355    n_chunks = n_mallocs;
    356 
    357    // Then we loop over the mempool tables. For each chunk in each
    358    // pool, we set the entry in the Bool array corresponding to the
    359    // malloc chunk containing the mempool chunk.
    360    VG_(HT_ResetIter)(MC_(mempool_list));
    361    while ( (mp = VG_(HT_Next)(MC_(mempool_list))) ) {
    362       VG_(HT_ResetIter)(mp->chunks);
    363       while ( (mc = VG_(HT_Next)(mp->chunks)) ) {
    364 
    365          // We'll need to record this chunk.
    366          n_chunks++;
    367 
    368          // Possibly invalidate the malloc holding the beginning of this chunk.
    369          m = find_chunk_for(mc->data, mallocs, n_mallocs);
    370          if (m != -1 && malloc_chunk_holds_a_pool_chunk[m] == False) {
    371             tl_assert(n_chunks > 0);
    372             n_chunks--;
    373             malloc_chunk_holds_a_pool_chunk[m] = True;
    374          }
    375 
    376          // Possibly invalidate the malloc holding the end of this chunk.
    377          if (mc->szB > 1) {
    378             m = find_chunk_for(mc->data + (mc->szB - 1), mallocs, n_mallocs);
    379             if (m != -1 && malloc_chunk_holds_a_pool_chunk[m] == False) {
    380                tl_assert(n_chunks > 0);
    381                n_chunks--;
    382                malloc_chunk_holds_a_pool_chunk[m] = True;
    383             }
    384          }
    385       }
    386    }
    387    tl_assert(n_chunks > 0);
    388 
    389    // Create final chunk array.
    390    chunks = VG_(malloc)("mc.fas.2", sizeof(VgHashNode*) * (n_chunks));
    391    s = 0;
    392 
    393    // Copy the mempool chunks and the non-marked malloc chunks into a
    394    // combined array of chunks.
    395    VG_(HT_ResetIter)(MC_(mempool_list));
    396    while ( (mp = VG_(HT_Next)(MC_(mempool_list))) ) {
    397       VG_(HT_ResetIter)(mp->chunks);
    398       while ( (mc = VG_(HT_Next)(mp->chunks)) ) {
    399          tl_assert(s < n_chunks);
    400          chunks[s++] = mc;
    401       }
    402    }
    403    for (m = 0; m < n_mallocs; ++m) {
    404       if (!malloc_chunk_holds_a_pool_chunk[m]) {
    405          tl_assert(s < n_chunks);
    406          chunks[s++] = mallocs[m];
    407       }
    408    }
    409    tl_assert(s == n_chunks);
    410 
    411    // Free temporaries.
    412    VG_(free)(mallocs);
    413    VG_(free)(malloc_chunk_holds_a_pool_chunk);
    414 
    415    *pn_chunks = n_chunks;
    416 
    417    return chunks;
    418 }
    419 
    420 /*------------------------------------------------------------*/
    421 /*--- The leak detector proper.                            ---*/
    422 /*------------------------------------------------------------*/
    423 
    424 // Holds extra info about each block during leak checking.
    425 typedef
    426    struct {
    427       UInt  state:2;    // Reachedness.
    428       UInt  pending:1;  // Scan pending.
    429       union {
    430          SizeT indirect_szB : (sizeof(SizeT)*8)-3; // If Unreached, how many bytes
    431                                                    //   are unreachable from here.
    432          SizeT  clique :  (sizeof(SizeT)*8)-3;      // if IndirectLeak, clique leader
    433                                                    // to which it belongs.
    434       } IorC;
    435    }
    436    LC_Extra;
    437 
    438 // An array holding pointers to every chunk we're checking.  Sorted by address.
    439 // lc_chunks is initialised during leak search. It is kept after leak search
    440 // to support printing the list of blocks belonging to a loss record.
    441 // lc_chunk array can only be used validly till the next "free" operation
    442 // (as a free operation potentially destroys one or more chunks).
    443 // To detect lc_chunk is valid, we store the nr of frees operations done
    444 // when lc_chunk was build : lc_chunks (and lc_extras) stays valid as
    445 // long as no free operations has been done since lc_chunks building.
    446 static MC_Chunk** lc_chunks;
    447 // How many chunks we're dealing with.
    448 static Int        lc_n_chunks;
    449 static SizeT lc_chunks_n_frees_marker;
    450 // This has the same number of entries as lc_chunks, and each entry
    451 // in lc_chunks corresponds with the entry here (ie. lc_chunks[i] and
    452 // lc_extras[i] describe the same block).
    453 static LC_Extra* lc_extras;
    454 
    455 // chunks will be converted and merged in loss record, maintained in lr_table
    456 // lr_table elements are kept from one leak_search to another to implement
    457 // the "print new/changed leaks" client request
    458 static OSet*        lr_table;
    459 // Array of sorted loss record (produced during last leak search).
    460 static LossRecord** lr_array;
    461 
    462 
    463 // DeltaMode used the last time we called detect_memory_leaks.
    464 // The recorded leak errors must be output using a logic based on this delta_mode.
    465 // The below avoids replicating the delta_mode in each LossRecord.
    466 LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
    467 
    468 
    469 // Records chunks that are currently being processed.  Each element in the
    470 // stack is an index into lc_chunks and lc_extras.  Its size is
    471 // 'lc_n_chunks' because in the worst case that's how many chunks could be
    472 // pushed onto it (actually I think the maximum is lc_n_chunks-1 but let's
    473 // be conservative).
    474 static Int* lc_markstack;
    475 // The index of the top element of the stack; -1 if the stack is empty, 0 if
    476 // the stack has one element, 1 if it has two, etc.
    477 static Int  lc_markstack_top;
    478 
    479 // Keeps track of how many bytes of memory we've scanned, for printing.
    480 // (Nb: We don't keep track of how many register bytes we've scanned.)
    481 static SizeT lc_scanned_szB;
    482 
    483 
    484 SizeT MC_(bytes_leaked)     = 0;
    485 SizeT MC_(bytes_indirect)   = 0;
    486 SizeT MC_(bytes_dubious)    = 0;
    487 SizeT MC_(bytes_reachable)  = 0;
    488 SizeT MC_(bytes_suppressed) = 0;
    489 
    490 SizeT MC_(blocks_leaked)     = 0;
    491 SizeT MC_(blocks_indirect)   = 0;
    492 SizeT MC_(blocks_dubious)    = 0;
    493 SizeT MC_(blocks_reachable)  = 0;
    494 SizeT MC_(blocks_suppressed) = 0;
    495 
    496 // Determines if a pointer is to a chunk.  Returns the chunk number et al
    497 // via call-by-reference.
    498 static Bool
    499 lc_is_a_chunk_ptr(Addr ptr, Int* pch_no, MC_Chunk** pch, LC_Extra** pex)
    500 {
    501    Int ch_no;
    502    MC_Chunk* ch;
    503    LC_Extra* ex;
    504 
    505    // Quick filter. Note: implemented with am, not with get_vabits2
    506    // as ptr might be random data pointing anywhere. On 64 bit
    507    // platforms, getting va bits for random data can be quite costly
    508    // due to the secondary map.
    509    if (!VG_(am_is_valid_for_client)(ptr, 1, VKI_PROT_READ)) {
    510       return False;
    511    } else {
    512       ch_no = find_chunk_for(ptr, lc_chunks, lc_n_chunks);
    513       tl_assert(ch_no >= -1 && ch_no < lc_n_chunks);
    514 
    515       if (ch_no == -1) {
    516          return False;
    517       } else {
    518          // Ok, we've found a pointer to a chunk.  Get the MC_Chunk and its
    519          // LC_Extra.
    520          ch = lc_chunks[ch_no];
    521          ex = &(lc_extras[ch_no]);
    522 
    523          tl_assert(ptr >= ch->data);
    524          tl_assert(ptr < ch->data + ch->szB + (ch->szB==0  ? 1  : 0));
    525 
    526          if (VG_DEBUG_LEAKCHECK)
    527             VG_(printf)("ptr=%#lx -> block %d\n", ptr, ch_no);
    528 
    529          *pch_no = ch_no;
    530          *pch    = ch;
    531          *pex    = ex;
    532 
    533          return True;
    534       }
    535    }
    536 }
    537 
    538 // Push a chunk (well, just its index) onto the mark stack.
    539 static void lc_push(Int ch_no, MC_Chunk* ch)
    540 {
    541    if (!lc_extras[ch_no].pending) {
    542       if (0) {
    543          VG_(printf)("pushing %#lx-%#lx\n", ch->data, ch->data + ch->szB);
    544       }
    545       lc_markstack_top++;
    546       tl_assert(lc_markstack_top < lc_n_chunks);
    547       lc_markstack[lc_markstack_top] = ch_no;
    548       tl_assert(!lc_extras[ch_no].pending);
    549       lc_extras[ch_no].pending = True;
    550    }
    551 }
    552 
    553 // Return the index of the chunk on the top of the mark stack, or -1 if
    554 // there isn't one.
    555 static Bool lc_pop(Int* ret)
    556 {
    557    if (-1 == lc_markstack_top) {
    558       return False;
    559    } else {
    560       tl_assert(0 <= lc_markstack_top && lc_markstack_top < lc_n_chunks);
    561       *ret = lc_markstack[lc_markstack_top];
    562       lc_markstack_top--;
    563       tl_assert(lc_extras[*ret].pending);
    564       lc_extras[*ret].pending = False;
    565       return True;
    566    }
    567 }
    568 
    569 
    570 // If 'ptr' is pointing to a heap-allocated block which hasn't been seen
    571 // before, push it onto the mark stack.
    572 static void
    573 lc_push_without_clique_if_a_chunk_ptr(Addr ptr, Bool is_prior_definite)
    574 {
    575    Int ch_no;
    576    MC_Chunk* ch;
    577    LC_Extra* ex;
    578 
    579    if ( ! lc_is_a_chunk_ptr(ptr, &ch_no, &ch, &ex) )
    580       return;
    581 
    582    // Possibly upgrade the state, ie. one of:
    583    // - Unreached --> Possible
    584    // - Unreached --> Reachable
    585    // - Possible  --> Reachable
    586    if (ptr == ch->data && is_prior_definite && ex->state != Reachable) {
    587       // 'ptr' points to the start of the block, and the prior node is
    588       // definite, which means that this block is definitely reachable.
    589       ex->state = Reachable;
    590 
    591       // State has changed to Reachable so (re)scan the block to make
    592       // sure any blocks it points to are correctly marked.
    593       lc_push(ch_no, ch);
    594 
    595    } else if (ex->state == Unreached) {
    596       // Either 'ptr' is a interior-pointer, or the prior node isn't definite,
    597       // which means that we can only mark this block as possibly reachable.
    598       ex->state = Possible;
    599 
    600       // State has changed to Possible so (re)scan the block to make
    601       // sure any blocks it points to are correctly marked.
    602       lc_push(ch_no, ch);
    603    }
    604 }
    605 
    606 static void
    607 lc_push_if_a_chunk_ptr_register(ThreadId tid, HChar* regname, Addr ptr)
    608 {
    609    lc_push_without_clique_if_a_chunk_ptr(ptr, /*is_prior_definite*/True);
    610 }
    611 
    612 // If ptr is pointing to a heap-allocated block which hasn't been seen
    613 // before, push it onto the mark stack.  Clique is the index of the
    614 // clique leader.
    615 static void
    616 lc_push_with_clique_if_a_chunk_ptr(Addr ptr, Int clique, Int cur_clique)
    617 {
    618    Int ch_no;
    619    MC_Chunk* ch;
    620    LC_Extra* ex;
    621 
    622    tl_assert(0 <= clique && clique < lc_n_chunks);
    623 
    624    if ( ! lc_is_a_chunk_ptr(ptr, &ch_no, &ch, &ex) )
    625       return;
    626 
    627    // If it's not Unreached, it's already been handled so ignore it.
    628    // If ch_no==clique, it's the clique leader, which means this is a cyclic
    629    // structure;  again ignore it because it's already been handled.
    630    if (ex->state == Unreached && ch_no != clique) {
    631       // Note that, unlike reachable blocks, we currently don't distinguish
    632       // between start-pointers and interior-pointers here.  We probably
    633       // should, though.
    634       lc_push(ch_no, ch);
    635 
    636       // Add the block to the clique, and add its size to the
    637       // clique-leader's indirect size.  Also, if the new block was
    638       // itself a clique leader, it isn't any more, so add its
    639       // indirect_szB to the new clique leader.
    640       if (VG_DEBUG_CLIQUE) {
    641          if (ex->IorC.indirect_szB > 0)
    642             VG_(printf)("  clique %d joining clique %d adding %lu+%lu\n",
    643                         ch_no, clique, (unsigned long)ch->szB,
    644 			(unsigned long)ex->IorC.indirect_szB);
    645          else
    646             VG_(printf)("  block %d joining clique %d adding %lu\n",
    647                         ch_no, clique, (unsigned long)ch->szB);
    648       }
    649 
    650       lc_extras[clique].IorC.indirect_szB += ch->szB;
    651       lc_extras[clique].IorC.indirect_szB += ex->IorC.indirect_szB;
    652       ex->state = IndirectLeak;
    653       ex->IorC.clique = (SizeT) cur_clique;
    654    }
    655 }
    656 
    657 static void
    658 lc_push_if_a_chunk_ptr(Addr ptr, Int clique, Int cur_clique, Bool is_prior_definite)
    659 {
    660    if (-1 == clique)
    661       lc_push_without_clique_if_a_chunk_ptr(ptr, is_prior_definite);
    662    else
    663       lc_push_with_clique_if_a_chunk_ptr(ptr, clique, cur_clique);
    664 }
    665 
    666 
    667 static VG_MINIMAL_JMP_BUF(memscan_jmpbuf);
    668 
    669 static
    670 void scan_all_valid_memory_catcher ( Int sigNo, Addr addr )
    671 {
    672    if (0)
    673       VG_(printf)("OUCH! sig=%d addr=%#lx\n", sigNo, addr);
    674    if (sigNo == VKI_SIGSEGV || sigNo == VKI_SIGBUS)
    675       VG_MINIMAL_LONGJMP(memscan_jmpbuf);
    676 }
    677 
    678 // lc_scan_memory has 2 modes:
    679 //
    680 // 1. Leak check mode (searched == 0).
    681 // -----------------------------------
    682 // Scan a block of memory between [start, start+len).  This range may
    683 // be bogus, inaccessable, or otherwise strange; we deal with it.  For each
    684 // valid aligned word we assume it's a pointer to a chunk a push the chunk
    685 // onto the mark stack if so.
    686 // clique is the "highest level clique" in which indirectly leaked blocks have
    687 // to be collected. cur_clique is the current "lower" level clique through which
    688 // the memory to be scanned has been found.
    689 // Example: in the below tree if A is leaked, the top level clique will
    690 //   be A, while lower level cliques will be B and C.
    691 /*
    692            A
    693          /   \
    694         B     C
    695        / \   / \
    696       D   E F   G
    697 */
    698 // Proper handling of top and lowest level clique allows block_list of a loss
    699 // record to describe the hierarchy of indirectly leaked blocks.
    700 //
    701 // 2. Search ptr mode (searched != 0).
    702 // -----------------------------------
    703 // In this mode, searches for pointers to a specific address range
    704 // In such a case, lc_scan_memory just scans [start..start+len[ for pointers to searched
    705 // and outputs the places where searched is found. It does not recursively scans the
    706 // found memory.
    707 static void
    708 lc_scan_memory(Addr start, SizeT len, Bool is_prior_definite, Int clique, Int cur_clique,
    709                Addr searched, SizeT szB)
    710 {
    711    /* memory scan is based on the assumption that valid pointers are aligned
    712       on a multiple of sizeof(Addr). So, we can (and must) skip the begin and
    713       end portions of the block if they are not aligned on sizeof(Addr):
    714       These cannot be a valid pointer, and calls to MC_(is_valid_aligned_word)
    715       will assert for a non aligned address. */
    716    Addr ptr = VG_ROUNDUP(start,     sizeof(Addr));
    717    Addr end = VG_ROUNDDN(start+len, sizeof(Addr));
    718    vki_sigset_t sigmask;
    719 
    720    if (VG_DEBUG_LEAKCHECK)
    721       VG_(printf)("scan %#lx-%#lx (%lu)\n", start, end, len);
    722 
    723    VG_(sigprocmask)(VKI_SIG_SETMASK, NULL, &sigmask);
    724    VG_(set_fault_catcher)(scan_all_valid_memory_catcher);
    725 
    726    /* Optimisation: the loop below will check for each begin
    727       of SM chunk if the chunk is fully unaddressable. The idea is to
    728       skip efficiently such fully unaddressable SM chunks.
    729       So, we preferrably start the loop on a chunk boundary.
    730       If the chunk is not fully unaddressable, we might be in
    731       an unaddressable page. Again, the idea is to skip efficiently
    732       such unaddressable page : this is the "else" part.
    733       We use an "else" so that two consecutive fully unaddressable
    734       SM chunks will be skipped efficiently: first one is skipped
    735       by this piece of code. The next SM chunk will be skipped inside
    736       the loop. */
    737    if ( ! MC_(is_within_valid_secondary)(ptr) ) {
    738       // Skip an invalid SM chunk till the beginning of the next SM Chunk.
    739       ptr = VG_ROUNDUP(ptr+1, SM_SIZE);
    740    } else if (!VG_(am_is_valid_for_client)(ptr, sizeof(Addr), VKI_PROT_READ)) {
    741       // else we are in a (at least partially) valid SM chunk.
    742       // We might be in the middle of an unreadable page.
    743       // Do a cheap check to see if it's valid;
    744       // if not, skip onto the next page.
    745       ptr = VG_PGROUNDUP(ptr+1);        // First page is bad - skip it.
    746    }
    747    /* This optimisation and below loop is based on some relationships between
    748       VKI_PAGE_SIZE, SM_SIZE and sizeof(Addr) which are asserted in
    749       MC_(detect_memory_leaks). */
    750 
    751    while (ptr < end) {
    752       Addr addr;
    753 
    754       // Skip invalid chunks.
    755       if (UNLIKELY((ptr % SM_SIZE) == 0)) {
    756          if (! MC_(is_within_valid_secondary)(ptr) ) {
    757             ptr = VG_ROUNDUP(ptr+1, SM_SIZE);
    758             continue;
    759          }
    760       }
    761 
    762       // Look to see if this page seems reasonable.
    763       if (UNLIKELY((ptr % VKI_PAGE_SIZE) == 0)) {
    764          if (!VG_(am_is_valid_for_client)(ptr, sizeof(Addr), VKI_PROT_READ)) {
    765             ptr += VKI_PAGE_SIZE;      // Bad page - skip it.
    766             continue;
    767          }
    768          // aspacemgr indicates the page is readable and belongs to client.
    769          // We still probe the page explicitely in case aspacemgr is
    770          // desynchronised with the real page mappings.
    771          // Such a desynchronisation can happen due to an aspacemgr bug.
    772          // Note that if the application is using mprotect(NONE), then
    773          // a page can be unreadable but have addressable and defined
    774          // VA bits (see mc_main.c function mc_new_mem_mprotect).
    775          if (VG_MINIMAL_SETJMP(memscan_jmpbuf) == 0) {
    776             // Try a read in the beginning of the page ...
    777             Addr test = *(volatile Addr *)ptr;
    778             __asm__ __volatile__("": :"r"(test) : "cc","memory");
    779          } else {
    780             // Catch read error ...
    781             // We need to restore the signal mask, because we were
    782             // longjmped out of a signal handler.
    783             VG_(sigprocmask)(VKI_SIG_SETMASK, &sigmask, NULL);
    784             ptr += VKI_PAGE_SIZE;      // Bad page - skip it.
    785             continue;
    786          }
    787       }
    788 
    789       if ( MC_(is_valid_aligned_word)(ptr) ) {
    790          lc_scanned_szB += sizeof(Addr);
    791          addr = *(Addr *)ptr;
    792          // If we get here, the scanned word is in valid memory.  Now
    793          // let's see if its contents point to a chunk.
    794          if (UNLIKELY(searched)) {
    795             if (addr >= searched && addr < searched + szB) {
    796                if (addr == searched)
    797                   VG_(umsg)("*%#lx points at %#lx\n", ptr, searched);
    798                else
    799                   VG_(umsg)("*%#lx interior points at %lu bytes inside %#lx\n",
    800                             ptr, (long unsigned) addr - searched, searched);
    801                MC_(pp_describe_addr) (ptr);
    802             }
    803          } else {
    804             lc_push_if_a_chunk_ptr(addr, clique, cur_clique, is_prior_definite);
    805          }
    806       } else if (0 && VG_DEBUG_LEAKCHECK) {
    807          VG_(printf)("%#lx not valid\n", ptr);
    808       }
    809       ptr += sizeof(Addr);
    810    }
    811 
    812    VG_(sigprocmask)(VKI_SIG_SETMASK, &sigmask, NULL);
    813    VG_(set_fault_catcher)(NULL);
    814 }
    815 
    816 
    817 // Process the mark stack until empty.
    818 static void lc_process_markstack(Int clique)
    819 {
    820    Int  top = -1;    // shut gcc up
    821    Bool is_prior_definite;
    822 
    823    while (lc_pop(&top)) {
    824       tl_assert(top >= 0 && top < lc_n_chunks);
    825 
    826       // See comment about 'is_prior_definite' at the top to understand this.
    827       is_prior_definite = ( Possible != lc_extras[top].state );
    828 
    829       lc_scan_memory(lc_chunks[top]->data, lc_chunks[top]->szB,
    830                      is_prior_definite, clique, (clique == -1 ? -1 : top),
    831                      /*searched*/ 0, 0);
    832    }
    833 }
    834 
    835 static Word cmp_LossRecordKey_LossRecord(const void* key, const void* elem)
    836 {
    837    LossRecordKey* a = (LossRecordKey*)key;
    838    LossRecordKey* b = &(((LossRecord*)elem)->key);
    839 
    840    // Compare on states first because that's fast.
    841    if (a->state < b->state) return -1;
    842    if (a->state > b->state) return  1;
    843    // Ok, the states are equal.  Now compare the locations, which is slower.
    844    if (VG_(eq_ExeContext)(
    845             MC_(clo_leak_resolution), a->allocated_at, b->allocated_at))
    846       return 0;
    847    // Different locations.  Ordering is arbitrary, just use the ec pointer.
    848    if (a->allocated_at < b->allocated_at) return -1;
    849    if (a->allocated_at > b->allocated_at) return  1;
    850    VG_(tool_panic)("bad LossRecord comparison");
    851 }
    852 
    853 static Int cmp_LossRecords(void* va, void* vb)
    854 {
    855    LossRecord* lr_a = *(LossRecord**)va;
    856    LossRecord* lr_b = *(LossRecord**)vb;
    857    SizeT total_szB_a = lr_a->szB + lr_a->indirect_szB;
    858    SizeT total_szB_b = lr_b->szB + lr_b->indirect_szB;
    859 
    860    // First compare by sizes.
    861    if (total_szB_a < total_szB_b) return -1;
    862    if (total_szB_a > total_szB_b) return  1;
    863    // If size are equal, compare by states.
    864    if (lr_a->key.state < lr_b->key.state) return -1;
    865    if (lr_a->key.state > lr_b->key.state) return  1;
    866    // If they're still equal here, it doesn't matter that much, but we keep
    867    // comparing other things so that regtests are as deterministic as
    868    // possible.  So:  compare num_blocks.
    869    if (lr_a->num_blocks < lr_b->num_blocks) return -1;
    870    if (lr_a->num_blocks > lr_b->num_blocks) return  1;
    871    // Finally, compare ExeContext addresses... older ones are likely to have
    872    // lower addresses.
    873    if (lr_a->key.allocated_at < lr_b->key.allocated_at) return -1;
    874    if (lr_a->key.allocated_at > lr_b->key.allocated_at) return  1;
    875    return 0;
    876 }
    877 
    878 // allocates or reallocates lr_array, and set its elements to the loss records
    879 // contains in lr_table.
    880 static Int get_lr_array_from_lr_table(void) {
    881    Int          i, n_lossrecords;
    882    LossRecord*  lr;
    883 
    884    n_lossrecords = VG_(OSetGen_Size)(lr_table);
    885 
    886    // (re-)create the array of pointers to the loss records.
    887    // lr_array is kept to allow producing the block list from gdbserver.
    888    if (lr_array != NULL)
    889       VG_(free)(lr_array);
    890    lr_array = VG_(malloc)("mc.pr.2", n_lossrecords * sizeof(LossRecord*));
    891    i = 0;
    892    VG_(OSetGen_ResetIter)(lr_table);
    893    while ( (lr = VG_(OSetGen_Next)(lr_table)) ) {
    894       lr_array[i++] = lr;
    895    }
    896    tl_assert(i == n_lossrecords);
    897    return n_lossrecords;
    898 }
    899 
    900 
    901 static void get_printing_rules(LeakCheckParams* lcp,
    902                                LossRecord*  lr,
    903                                Bool* count_as_error,
    904                                Bool* print_record)
    905 {
    906    // Rules for printing:
    907    // - We don't show suppressed loss records ever (and that's controlled
    908    //   within the error manager).
    909    // - We show non-suppressed loss records that are not "reachable" if
    910    //   --leak-check=yes.
    911    // - We show all non-suppressed loss records if --leak-check=yes and
    912    //   --show-reachable=yes.
    913    //
    914    // Nb: here "reachable" means Reachable *or* IndirectLeak;  note that
    915    // this is different to "still reachable" used elsewhere because it
    916    // includes indirectly lost blocks!
    917 
    918    Bool delta_considered;
    919 
    920    switch (lcp->deltamode) {
    921    case LCD_Any:
    922       delta_considered = lr->num_blocks > 0;
    923       break;
    924    case LCD_Increased:
    925       delta_considered
    926          = lr->szB > lr->old_szB
    927          || lr->indirect_szB > lr->old_indirect_szB
    928          || lr->num_blocks > lr->old_num_blocks;
    929       break;
    930    case LCD_Changed:
    931       delta_considered = lr->szB != lr->old_szB
    932          || lr->indirect_szB != lr->old_indirect_szB
    933          || lr->num_blocks != lr->old_num_blocks;
    934       break;
    935    default:
    936       tl_assert(0);
    937    }
    938 
    939    *print_record = lcp->mode == LC_Full && delta_considered &&
    940       ( lcp->show_reachable ||
    941         Unreached == lr->key.state ||
    942         ( lcp->show_possibly_lost &&
    943           Possible  == lr->key.state ) );
    944    // We don't count a leaks as errors with lcp->mode==LC_Summary.
    945    // Otherwise you can get high error counts with few or no error
    946    // messages, which can be confusing.  Also, you could argue that
    947    // indirect leaks should be counted as errors, but it seems better to
    948    // make the counting criteria similar to the printing criteria.  So we
    949    // don't count them.
    950    *count_as_error = lcp->mode == LC_Full && delta_considered &&
    951       ( Unreached == lr->key.state ||
    952         Possible  == lr->key.state );
    953 }
    954 
    955 static void print_results(ThreadId tid, LeakCheckParams* lcp)
    956 {
    957    Int          i, n_lossrecords, start_lr_output_scan;
    958    LossRecord*  lr;
    959    Bool         is_suppressed;
    960    SizeT        old_bytes_leaked      = MC_(bytes_leaked); /* to report delta in summary */
    961    SizeT        old_bytes_indirect    = MC_(bytes_indirect);
    962    SizeT        old_bytes_dubious     = MC_(bytes_dubious);
    963    SizeT        old_bytes_reachable   = MC_(bytes_reachable);
    964    SizeT        old_bytes_suppressed  = MC_(bytes_suppressed);
    965    SizeT        old_blocks_leaked     = MC_(blocks_leaked);
    966    SizeT        old_blocks_indirect   = MC_(blocks_indirect);
    967    SizeT        old_blocks_dubious    = MC_(blocks_dubious);
    968    SizeT        old_blocks_reachable  = MC_(blocks_reachable);
    969    SizeT        old_blocks_suppressed = MC_(blocks_suppressed);
    970 
    971    if (lr_table == NULL)
    972       // Create the lr_table, which holds the loss records.
    973       // If the lr_table already exists, it means it contains
    974       // loss_records from the previous leak search. The old_*
    975       // values in these records are used to implement the
    976       // leak check delta mode
    977       lr_table =
    978          VG_(OSetGen_Create)(offsetof(LossRecord, key),
    979                              cmp_LossRecordKey_LossRecord,
    980                              VG_(malloc), "mc.pr.1",
    981                              VG_(free));
    982 
    983    // If we have loss records from a previous search, reset values to have
    984    // proper printing of the deltas between previous search and this search.
    985    n_lossrecords = get_lr_array_from_lr_table();
    986    for (i = 0; i < n_lossrecords; i++) {
    987       if (lr_array[i]->num_blocks == 0) {
    988          // remove from lr_table the old loss_records with 0 bytes found
    989          VG_(OSetGen_Remove) (lr_table, &lr_array[i]->key);
    990          VG_(OSetGen_FreeNode)(lr_table, lr_array[i]);
    991       } else {
    992          // move the leak sizes to old_* and zero the current sizes
    993          // for next leak search
    994          lr_array[i]->old_szB          = lr_array[i]->szB;
    995          lr_array[i]->old_indirect_szB = lr_array[i]->indirect_szB;
    996          lr_array[i]->old_num_blocks   = lr_array[i]->num_blocks;
    997          lr_array[i]->szB              = 0;
    998          lr_array[i]->indirect_szB     = 0;
    999          lr_array[i]->num_blocks       = 0;
   1000       }
   1001    }
   1002    // lr_array now contains "invalid" loss records => free it.
   1003    // lr_array will be re-created below with the kept and new loss records.
   1004    VG_(free) (lr_array);
   1005    lr_array = NULL;
   1006 
   1007    // Convert the chunks into loss records, merging them where appropriate.
   1008    for (i = 0; i < lc_n_chunks; i++) {
   1009       MC_Chunk*     ch = lc_chunks[i];
   1010       LC_Extra*     ex = &(lc_extras)[i];
   1011       LossRecord*   old_lr;
   1012       LossRecordKey lrkey;
   1013       lrkey.state        = ex->state;
   1014       lrkey.allocated_at = ch->where;
   1015 
   1016       old_lr = VG_(OSetGen_Lookup)(lr_table, &lrkey);
   1017       if (old_lr) {
   1018          // We found an existing loss record matching this chunk.  Update the
   1019          // loss record's details in-situ.  This is safe because we don't
   1020          // change the elements used as the OSet key.
   1021          old_lr->szB          += ch->szB;
   1022          if (ex->state == Unreached)
   1023             old_lr->indirect_szB += ex->IorC.indirect_szB;
   1024          old_lr->num_blocks++;
   1025       } else {
   1026          // No existing loss record matches this chunk.  Create a new loss
   1027          // record, initialise it from the chunk, and insert it into lr_table.
   1028          lr = VG_(OSetGen_AllocNode)(lr_table, sizeof(LossRecord));
   1029          lr->key              = lrkey;
   1030          lr->szB              = ch->szB;
   1031          if (ex->state == Unreached)
   1032             lr->indirect_szB     = ex->IorC.indirect_szB;
   1033          else
   1034             lr->indirect_szB     = 0;
   1035          lr->num_blocks       = 1;
   1036          lr->old_szB          = 0;
   1037          lr->old_indirect_szB = 0;
   1038          lr->old_num_blocks   = 0;
   1039          VG_(OSetGen_Insert)(lr_table, lr);
   1040       }
   1041    }
   1042 
   1043    // (re-)create the array of pointers to the (new) loss records.
   1044    n_lossrecords = get_lr_array_from_lr_table ();
   1045    tl_assert(VG_(OSetGen_Size)(lr_table) == n_lossrecords);
   1046 
   1047    // Sort the array by loss record sizes.
   1048    VG_(ssort)(lr_array, n_lossrecords, sizeof(LossRecord*),
   1049               cmp_LossRecords);
   1050 
   1051    // Zero totals.
   1052    MC_(blocks_leaked)     = MC_(bytes_leaked)     = 0;
   1053    MC_(blocks_indirect)   = MC_(bytes_indirect)   = 0;
   1054    MC_(blocks_dubious)    = MC_(bytes_dubious)    = 0;
   1055    MC_(blocks_reachable)  = MC_(bytes_reachable)  = 0;
   1056    MC_(blocks_suppressed) = MC_(bytes_suppressed) = 0;
   1057 
   1058    // If there is a maximum nr of loss records we can output, then first
   1059    // compute from where the output scan has to start.
   1060    // By default, start from the first loss record. Compute a higher
   1061    // value if there is a maximum to respect. We need to print the last
   1062    // records, as the one with the biggest sizes are more interesting.
   1063    start_lr_output_scan = 0;
   1064    if (lcp->mode == LC_Full && lcp->max_loss_records_output < n_lossrecords) {
   1065       Int nr_printable_records = 0;
   1066       for (i = n_lossrecords - 1; i >= 0 && start_lr_output_scan == 0; i--) {
   1067          Bool count_as_error, print_record;
   1068          lr = lr_array[i];
   1069          get_printing_rules (lcp, lr, &count_as_error, &print_record);
   1070          // Do not use get_printing_rules results for is_suppressed, as we
   1071          // only want to check if the record would be suppressed.
   1072          is_suppressed =
   1073             MC_(record_leak_error) ( tid, i+1, n_lossrecords, lr,
   1074                                      False /* print_record */,
   1075                                      False /* count_as_error */);
   1076          if (print_record && !is_suppressed) {
   1077             nr_printable_records++;
   1078             if (nr_printable_records == lcp->max_loss_records_output)
   1079                start_lr_output_scan = i;
   1080          }
   1081       }
   1082    }
   1083 
   1084    // Print the loss records (in size order) and collect summary stats.
   1085    for (i = start_lr_output_scan; i < n_lossrecords; i++) {
   1086       Bool count_as_error, print_record;
   1087       lr = lr_array[i];
   1088       get_printing_rules(lcp, lr, &count_as_error, &print_record);
   1089       is_suppressed =
   1090          MC_(record_leak_error) ( tid, i+1, n_lossrecords, lr, print_record,
   1091                                   count_as_error );
   1092 
   1093       if (is_suppressed) {
   1094          MC_(blocks_suppressed) += lr->num_blocks;
   1095          MC_(bytes_suppressed)  += lr->szB;
   1096 
   1097       } else if (Unreached == lr->key.state) {
   1098          MC_(blocks_leaked)     += lr->num_blocks;
   1099          MC_(bytes_leaked)      += lr->szB;
   1100 
   1101       } else if (IndirectLeak == lr->key.state) {
   1102          MC_(blocks_indirect)   += lr->num_blocks;
   1103          MC_(bytes_indirect)    += lr->szB;
   1104 
   1105       } else if (Possible == lr->key.state) {
   1106          MC_(blocks_dubious)    += lr->num_blocks;
   1107          MC_(bytes_dubious)     += lr->szB;
   1108 
   1109       } else if (Reachable == lr->key.state) {
   1110          MC_(blocks_reachable)  += lr->num_blocks;
   1111          MC_(bytes_reachable)   += lr->szB;
   1112 
   1113       } else {
   1114          VG_(tool_panic)("unknown loss mode");
   1115       }
   1116    }
   1117 
   1118    if (VG_(clo_verbosity) > 0 && !VG_(clo_xml)) {
   1119       char d_bytes[20];
   1120       char d_blocks[20];
   1121 
   1122       VG_(umsg)("LEAK SUMMARY:\n");
   1123       VG_(umsg)("   definitely lost: %'lu%s bytes in %'lu%s blocks\n",
   1124                 MC_(bytes_leaked),
   1125                 MC_(snprintf_delta) (d_bytes, 20, MC_(bytes_leaked), old_bytes_leaked, lcp->deltamode),
   1126                 MC_(blocks_leaked),
   1127                 MC_(snprintf_delta) (d_blocks, 20, MC_(blocks_leaked), old_blocks_leaked, lcp->deltamode));
   1128       VG_(umsg)("   indirectly lost: %'lu%s bytes in %'lu%s blocks\n",
   1129                 MC_(bytes_indirect),
   1130                 MC_(snprintf_delta) (d_bytes, 20, MC_(bytes_indirect), old_bytes_indirect, lcp->deltamode),
   1131                 MC_(blocks_indirect),
   1132                 MC_(snprintf_delta) (d_blocks, 20, MC_(blocks_indirect), old_blocks_indirect, lcp->deltamode) );
   1133       VG_(umsg)("     possibly lost: %'lu%s bytes in %'lu%s blocks\n",
   1134                 MC_(bytes_dubious),
   1135                 MC_(snprintf_delta) (d_bytes, 20, MC_(bytes_dubious), old_bytes_dubious, lcp->deltamode),
   1136                 MC_(blocks_dubious),
   1137                 MC_(snprintf_delta) (d_blocks, 20, MC_(blocks_dubious), old_blocks_dubious, lcp->deltamode) );
   1138       VG_(umsg)("   still reachable: %'lu%s bytes in %'lu%s blocks\n",
   1139                 MC_(bytes_reachable),
   1140                 MC_(snprintf_delta) (d_bytes, 20, MC_(bytes_reachable), old_bytes_reachable, lcp->deltamode),
   1141                 MC_(blocks_reachable),
   1142                 MC_(snprintf_delta) (d_blocks, 20, MC_(blocks_reachable), old_blocks_reachable, lcp->deltamode) );
   1143       VG_(umsg)("        suppressed: %'lu%s bytes in %'lu%s blocks\n",
   1144                 MC_(bytes_suppressed),
   1145                 MC_(snprintf_delta) (d_bytes, 20, MC_(bytes_suppressed), old_bytes_suppressed, lcp->deltamode),
   1146                 MC_(blocks_suppressed),
   1147                 MC_(snprintf_delta) (d_blocks, 20, MC_(blocks_suppressed), old_blocks_suppressed, lcp->deltamode) );
   1148       if (lcp->mode != LC_Full &&
   1149           (MC_(blocks_leaked) + MC_(blocks_indirect) +
   1150            MC_(blocks_dubious) + MC_(blocks_reachable)) > 0) {
   1151          if (lcp->requested_by_monitor_command)
   1152             VG_(umsg)("To see details of leaked memory, give 'full' arg to leak_check\n");
   1153          else
   1154             VG_(umsg)("Rerun with --leak-check=full to see details "
   1155                       "of leaked memory\n");
   1156       }
   1157       if (lcp->mode == LC_Full &&
   1158           MC_(blocks_reachable) > 0 && !lcp->show_reachable)
   1159       {
   1160          VG_(umsg)("Reachable blocks (those to which a pointer "
   1161                    "was found) are not shown.\n");
   1162          if (lcp->requested_by_monitor_command)
   1163             VG_(umsg)("To see them, add 'reachable any' args to leak_check\n");
   1164          else
   1165             VG_(umsg)("To see them, rerun with: --leak-check=full "
   1166                       "--show-reachable=yes\n");
   1167       }
   1168       VG_(umsg)("\n");
   1169    }
   1170 }
   1171 
   1172 // print recursively all indirectly leaked blocks collected in clique.
   1173 static void print_clique (Int clique, UInt level)
   1174 {
   1175    Int ind;
   1176    Int i,  n_lossrecords;;
   1177 
   1178    n_lossrecords = VG_(OSetGen_Size)(lr_table);
   1179 
   1180    for (ind = 0; ind < lc_n_chunks; ind++) {
   1181       LC_Extra*     ind_ex = &(lc_extras)[ind];
   1182       if (ind_ex->state == IndirectLeak && ind_ex->IorC.clique == (SizeT) clique) {
   1183          MC_Chunk*    ind_ch = lc_chunks[ind];
   1184          LossRecord*  ind_lr;
   1185          LossRecordKey ind_lrkey;
   1186          Int lr_i;
   1187          ind_lrkey.state = ind_ex->state;
   1188          ind_lrkey.allocated_at = ind_ch->where;
   1189          ind_lr = VG_(OSetGen_Lookup)(lr_table, &ind_lrkey);
   1190          for (lr_i = 0; lr_i < n_lossrecords; lr_i++)
   1191             if (ind_lr == lr_array[lr_i])
   1192                break;
   1193          for (i = 0; i < level; i++)
   1194             VG_(umsg)("  ");
   1195          VG_(umsg)("%p[%lu] indirect loss record %d\n",
   1196                    (void *)ind_ch->data, (unsigned long)ind_ch->szB,
   1197                    lr_i+1); // lr_i+1 for user numbering.
   1198          if (lr_i >= n_lossrecords)
   1199             VG_(umsg)
   1200                ("error: no indirect loss record found for %p[%lu]?????\n",
   1201                 (void *)ind_ch->data, (unsigned long)ind_ch->szB);
   1202          print_clique(ind, level+1);
   1203       }
   1204    }
   1205  }
   1206 
   1207 Bool MC_(print_block_list) ( UInt loss_record_nr)
   1208 {
   1209    Int          i,  n_lossrecords;
   1210    LossRecord*  lr;
   1211 
   1212    if (lr_table == NULL || lc_chunks == NULL || lc_extras == NULL) {
   1213       VG_(umsg)("Can't print block list : no valid leak search result\n");
   1214       return False;
   1215    }
   1216 
   1217    if (lc_chunks_n_frees_marker != MC_(get_cmalloc_n_frees)()) {
   1218       VG_(umsg)("Can't print obsolete block list : redo a leak search first\n");
   1219       return False;
   1220    }
   1221 
   1222    n_lossrecords = VG_(OSetGen_Size)(lr_table);
   1223    if (loss_record_nr >= n_lossrecords)
   1224       return False; // Invalid loss record nr.
   1225 
   1226    tl_assert (lr_array);
   1227    lr = lr_array[loss_record_nr];
   1228 
   1229    // (re-)print the loss record details.
   1230    // (+1 on loss_record_nr as user numbering for loss records starts at 1).
   1231    MC_(pp_LossRecord)(loss_record_nr+1, n_lossrecords, lr);
   1232 
   1233    // Match the chunks with loss records.
   1234    for (i = 0; i < lc_n_chunks; i++) {
   1235       MC_Chunk*     ch = lc_chunks[i];
   1236       LC_Extra*     ex = &(lc_extras)[i];
   1237       LossRecord*   old_lr;
   1238       LossRecordKey lrkey;
   1239       lrkey.state        = ex->state;
   1240       lrkey.allocated_at = ch->where;
   1241 
   1242       old_lr = VG_(OSetGen_Lookup)(lr_table, &lrkey);
   1243       if (old_lr) {
   1244          // We found an existing loss record matching this chunk.
   1245          // If this is the loss record we are looking for, then output the pointer.
   1246          if (old_lr == lr_array[loss_record_nr]) {
   1247             VG_(umsg)("%p[%lu]\n",
   1248                       (void *)ch->data, (unsigned long) ch->szB);
   1249             if (ex->state != Reachable) {
   1250                // We can print the clique in all states, except Reachable.
   1251                // In Unreached state, lc_chunk[i] is the clique leader.
   1252                // In IndirectLeak, lc_chunk[i] might have been a clique leader
   1253                // which was later collected in another clique.
   1254                // For Possible, lc_chunk[i] might be the top of a clique
   1255                // or an intermediate clique.
   1256                print_clique(i, 1);
   1257             }
   1258          }
   1259       } else {
   1260          // No existing loss record matches this chunk ???
   1261          VG_(umsg)("error: no loss record found for %p[%lu]?????\n",
   1262                    (void *)ch->data, (unsigned long) ch->szB);
   1263       }
   1264    }
   1265    return True;
   1266 }
   1267 
   1268 // If searched = 0, scan memory root set, pushing onto the mark stack the blocks
   1269 // encountered.
   1270 // Otherwise (searched != 0), scan the memory root set searching for ptr pointing
   1271 // inside [searched, searched+szB[.
   1272 static void scan_memory_root_set(Addr searched, SizeT szB)
   1273 {
   1274    Int   i;
   1275    Int   n_seg_starts;
   1276    Addr* seg_starts = VG_(get_segment_starts)( &n_seg_starts );
   1277 
   1278    tl_assert(seg_starts && n_seg_starts > 0);
   1279 
   1280    lc_scanned_szB = 0;
   1281 
   1282    // VG_(am_show_nsegments)( 0, "leakcheck");
   1283    for (i = 0; i < n_seg_starts; i++) {
   1284       SizeT seg_size;
   1285       NSegment const* seg = VG_(am_find_nsegment)( seg_starts[i] );
   1286       tl_assert(seg);
   1287 
   1288       if (seg->kind != SkFileC && seg->kind != SkAnonC) continue;
   1289       if (!(seg->hasR && seg->hasW))                    continue;
   1290       if (seg->isCH)                                    continue;
   1291 
   1292       // Don't poke around in device segments as this may cause
   1293       // hangs.  Exclude /dev/zero just in case someone allocated
   1294       // memory by explicitly mapping /dev/zero.
   1295       if (seg->kind == SkFileC
   1296           && (VKI_S_ISCHR(seg->mode) || VKI_S_ISBLK(seg->mode))) {
   1297          HChar* dev_name = VG_(am_get_filename)( (NSegment*)seg );
   1298          if (dev_name && 0 == VG_(strcmp)(dev_name, "/dev/zero")) {
   1299             // Don't skip /dev/zero.
   1300          } else {
   1301             // Skip this device mapping.
   1302             continue;
   1303          }
   1304       }
   1305 
   1306       if (0)
   1307          VG_(printf)("ACCEPT %2d  %#lx %#lx\n", i, seg->start, seg->end);
   1308 
   1309       // Scan the segment.  We use -1 for the clique number, because this
   1310       // is a root-set.
   1311       seg_size = seg->end - seg->start + 1;
   1312       if (VG_(clo_verbosity) > 2) {
   1313          VG_(message)(Vg_DebugMsg,
   1314                       "  Scanning root segment: %#lx..%#lx (%lu)\n",
   1315                       seg->start, seg->end, seg_size);
   1316       }
   1317       lc_scan_memory(seg->start, seg_size, /*is_prior_definite*/True,
   1318                      /*clique*/-1, /*cur_clique*/-1,
   1319                      searched, szB);
   1320    }
   1321    VG_(free)(seg_starts);
   1322 }
   1323 
   1324 /*------------------------------------------------------------*/
   1325 /*--- Top-level entry point.                               ---*/
   1326 /*------------------------------------------------------------*/
   1327 
   1328 void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams* lcp)
   1329 {
   1330    Int i, j;
   1331 
   1332    tl_assert(lcp->mode != LC_Off);
   1333 
   1334    // Verify some assertions which are used in lc_scan_memory.
   1335    tl_assert((VKI_PAGE_SIZE % sizeof(Addr)) == 0);
   1336    tl_assert((SM_SIZE % sizeof(Addr)) == 0);
   1337    // Above two assertions are critical, while below assertion
   1338    // ensures that the optimisation in the loop is done in the
   1339    // correct order : the loop checks for (big) SM chunk skipping
   1340    // before checking for (smaller) page skipping.
   1341    tl_assert((SM_SIZE % VKI_PAGE_SIZE) == 0);
   1342 
   1343 
   1344    MC_(detect_memory_leaks_last_delta_mode) = lcp->deltamode;
   1345 
   1346    // Get the chunks, stop if there were none.
   1347    if (lc_chunks) {
   1348       VG_(free)(lc_chunks);
   1349       lc_chunks = NULL;
   1350    }
   1351    lc_chunks = find_active_chunks(&lc_n_chunks);
   1352    lc_chunks_n_frees_marker = MC_(get_cmalloc_n_frees)();
   1353    if (lc_n_chunks == 0) {
   1354       tl_assert(lc_chunks == NULL);
   1355       if (lr_table != NULL) {
   1356          // forget the previous recorded LossRecords as next leak search
   1357          // can in any case just create new leaks.
   1358          // Maybe it would be better to rather call print_result ?
   1359          // (at least when leak decreases are requested)
   1360          // This will then output all LossRecords with a size decreasing to 0
   1361          VG_(OSetGen_Destroy) (lr_table);
   1362          lr_table = NULL;
   1363       }
   1364       if (VG_(clo_verbosity) >= 1 && !VG_(clo_xml)) {
   1365          VG_(umsg)("All heap blocks were freed -- no leaks are possible\n");
   1366          VG_(umsg)("\n");
   1367       }
   1368       return;
   1369    }
   1370 
   1371    // Sort the array so blocks are in ascending order in memory.
   1372    VG_(ssort)(lc_chunks, lc_n_chunks, sizeof(VgHashNode*), compare_MC_Chunks);
   1373 
   1374    // Sanity check -- make sure they're in order.
   1375    for (i = 0; i < lc_n_chunks-1; i++) {
   1376       tl_assert( lc_chunks[i]->data <= lc_chunks[i+1]->data);
   1377    }
   1378 
   1379    // Sanity check -- make sure they don't overlap.  The one exception is that
   1380    // we allow a MALLOCLIKE block to sit entirely within a malloc() block.
   1381    // This is for bug 100628.  If this occurs, we ignore the malloc() block
   1382    // for leak-checking purposes.  This is a hack and probably should be done
   1383    // better, but at least it's consistent with mempools (which are treated
   1384    // like this in find_active_chunks).  Mempools have a separate VgHashTable
   1385    // for mempool chunks, but if custom-allocated blocks are put in a separate
   1386    // table from normal heap blocks it makes free-mismatch checking more
   1387    // difficult.
   1388    //
   1389    // If this check fails, it probably means that the application
   1390    // has done something stupid with VALGRIND_MALLOCLIKE_BLOCK client
   1391    // requests, eg. has made overlapping requests (which are
   1392    // nonsensical), or used VALGRIND_MALLOCLIKE_BLOCK for stack locations;
   1393    // again nonsensical.
   1394    //
   1395    for (i = 0; i < lc_n_chunks-1; i++) {
   1396       MC_Chunk* ch1 = lc_chunks[i];
   1397       MC_Chunk* ch2 = lc_chunks[i+1];
   1398 
   1399       Addr start1    = ch1->data;
   1400       Addr start2    = ch2->data;
   1401       Addr end1      = ch1->data + ch1->szB - 1;
   1402       Addr end2      = ch2->data + ch2->szB - 1;
   1403       Bool isCustom1 = ch1->allockind == MC_AllocCustom;
   1404       Bool isCustom2 = ch2->allockind == MC_AllocCustom;
   1405 
   1406       if (end1 < start2) {
   1407          // Normal case - no overlap.
   1408 
   1409       // We used to allow exact duplicates, I'm not sure why.  --njn
   1410       //} else if (start1 == start2 && end1 == end2) {
   1411          // Degenerate case: exact duplicates.
   1412 
   1413       } else if (start1 >= start2 && end1 <= end2 && isCustom1 && !isCustom2) {
   1414          // Block i is MALLOCLIKE and entirely within block i+1.
   1415          // Remove block i+1.
   1416          for (j = i+1; j < lc_n_chunks-1; j++) {
   1417             lc_chunks[j] = lc_chunks[j+1];
   1418          }
   1419          lc_n_chunks--;
   1420 
   1421       } else if (start2 >= start1 && end2 <= end1 && isCustom2 && !isCustom1) {
   1422          // Block i+1 is MALLOCLIKE and entirely within block i.
   1423          // Remove block i.
   1424          for (j = i; j < lc_n_chunks-1; j++) {
   1425             lc_chunks[j] = lc_chunks[j+1];
   1426          }
   1427          lc_n_chunks--;
   1428 
   1429       } else {
   1430          VG_(umsg)("Block 0x%lx..0x%lx overlaps with block 0x%lx..0x%lx\n",
   1431                    start1, end1, start2, end2);
   1432          VG_(umsg)("Blocks allocation contexts:\n"),
   1433          VG_(pp_ExeContext)( ch1->where);
   1434          VG_(umsg)("\n"),
   1435          VG_(pp_ExeContext)( ch2->where);
   1436          VG_(umsg)("This is usually caused by using VALGRIND_MALLOCLIKE_BLOCK");
   1437          VG_(umsg)("in an inappropriate way.\n");
   1438          tl_assert (0);
   1439       }
   1440    }
   1441 
   1442    // Initialise lc_extras.
   1443    if (lc_extras) {
   1444       VG_(free)(lc_extras);
   1445       lc_extras = NULL;
   1446    }
   1447    lc_extras = VG_(malloc)( "mc.dml.2", lc_n_chunks * sizeof(LC_Extra) );
   1448    for (i = 0; i < lc_n_chunks; i++) {
   1449       lc_extras[i].state        = Unreached;
   1450       lc_extras[i].pending      = False;
   1451       lc_extras[i].IorC.indirect_szB = 0;
   1452    }
   1453 
   1454    // Initialise lc_markstack.
   1455    lc_markstack = VG_(malloc)( "mc.dml.2", lc_n_chunks * sizeof(Int) );
   1456    for (i = 0; i < lc_n_chunks; i++) {
   1457       lc_markstack[i] = -1;
   1458    }
   1459    lc_markstack_top = -1;
   1460 
   1461    // Verbosity.
   1462    if (VG_(clo_verbosity) > 1 && !VG_(clo_xml)) {
   1463       VG_(umsg)( "Searching for pointers to %'d not-freed blocks\n",
   1464                  lc_n_chunks );
   1465    }
   1466 
   1467    // Scan the memory root-set, pushing onto the mark stack any blocks
   1468    // pointed to.
   1469    scan_memory_root_set(/*searched*/0, 0);
   1470 
   1471    // Scan GP registers for chunk pointers.
   1472    VG_(apply_to_GP_regs)(lc_push_if_a_chunk_ptr_register);
   1473 
   1474    // Process the pushed blocks.  After this, every block that is reachable
   1475    // from the root-set has been traced.
   1476    lc_process_markstack(/*clique*/-1);
   1477 
   1478    if (VG_(clo_verbosity) > 1 && !VG_(clo_xml)) {
   1479       VG_(umsg)("Checked %'lu bytes\n", lc_scanned_szB);
   1480       VG_(umsg)( "\n" );
   1481    }
   1482 
   1483    // Trace all the leaked blocks to determine which are directly leaked and
   1484    // which are indirectly leaked.  For each Unreached block, push it onto
   1485    // the mark stack, and find all the as-yet-Unreached blocks reachable
   1486    // from it.  These form a clique and are marked IndirectLeak, and their
   1487    // size is added to the clique leader's indirect size.  If one of the
   1488    // found blocks was itself a clique leader (from a previous clique), then
   1489    // the cliques are merged.
   1490    for (i = 0; i < lc_n_chunks; i++) {
   1491       MC_Chunk* ch = lc_chunks[i];
   1492       LC_Extra* ex = &(lc_extras[i]);
   1493 
   1494       if (VG_DEBUG_CLIQUE)
   1495          VG_(printf)("cliques: %d at %#lx -> Loss state %d\n",
   1496                      i, ch->data, ex->state);
   1497 
   1498       tl_assert(lc_markstack_top == -1);
   1499 
   1500       if (ex->state == Unreached) {
   1501          if (VG_DEBUG_CLIQUE)
   1502             VG_(printf)("%d: gathering clique %#lx\n", i, ch->data);
   1503 
   1504          // Push this Unreached block onto the stack and process it.
   1505          lc_push(i, ch);
   1506          lc_process_markstack(/*clique*/i);
   1507 
   1508          tl_assert(lc_markstack_top == -1);
   1509          tl_assert(ex->state == Unreached);
   1510       }
   1511    }
   1512 
   1513    print_results( tid, lcp);
   1514 
   1515    VG_(free) ( lc_markstack );
   1516    lc_markstack = NULL;
   1517    // lc_chunks, lc_extras, lr_array and lr_table are kept (needed if user
   1518    // calls MC_(print_block_list)). lr_table also used for delta leak reporting
   1519    // between this leak search and the next leak search.
   1520 }
   1521 
   1522 static Addr searched_wpa;
   1523 static SizeT searched_szB;
   1524 static void
   1525 search_address_in_GP_reg(ThreadId tid, HChar* regname, Addr addr_in_reg)
   1526 {
   1527    if (addr_in_reg >= searched_wpa
   1528        && addr_in_reg < searched_wpa + searched_szB) {
   1529       if (addr_in_reg == searched_wpa)
   1530          VG_(umsg)
   1531             ("tid %d register %s pointing at %#lx\n",
   1532              tid, regname, searched_wpa);
   1533       else
   1534          VG_(umsg)
   1535             ("tid %d register %s interior pointing %lu bytes inside %#lx\n",
   1536              tid, regname, (long unsigned) addr_in_reg - searched_wpa,
   1537              searched_wpa);
   1538    }
   1539 }
   1540 
   1541 void MC_(who_points_at) ( Addr address, SizeT szB)
   1542 {
   1543    MC_Chunk** chunks;
   1544    Int        n_chunks;
   1545    Int        i;
   1546 
   1547    if (szB == 1)
   1548       VG_(umsg) ("Searching for pointers to %#lx\n", address);
   1549    else
   1550       VG_(umsg) ("Searching for pointers pointing in %lu bytes from %#lx\n",
   1551                  szB, address);
   1552 
   1553    // Scan memory root-set, searching for ptr pointing in address[szB]
   1554    scan_memory_root_set(address, szB);
   1555 
   1556    // Scan active malloc-ed chunks
   1557    chunks = find_active_chunks(&n_chunks);
   1558    for (i = 0; i < n_chunks; i++) {
   1559       lc_scan_memory(chunks[i]->data, chunks[i]->szB,
   1560                      /*is_prior_definite*/True,
   1561                      /*clique*/-1, /*cur_clique*/-1,
   1562                      address, szB);
   1563    }
   1564    VG_(free) ( chunks );
   1565 
   1566    // Scan GP registers for pointers to address range.
   1567    searched_wpa = address;
   1568    searched_szB = szB;
   1569    VG_(apply_to_GP_regs)(search_address_in_GP_reg);
   1570 
   1571 }
   1572 
   1573 /*--------------------------------------------------------------------*/
   1574 /*--- end                                                          ---*/
   1575 /*--------------------------------------------------------------------*/
   1576 
   1577