Home | History | Annotate | Download | only in memcheck
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- A header file for all parts of the MemCheck tool.            ---*/
      4 /*---                                                 mc_include.h ---*/
      5 /*--------------------------------------------------------------------*/
      6 
      7 /*
      8    This file is part of MemCheck, a heavyweight Valgrind tool for
      9    detecting memory errors.
     10 
     11    Copyright (C) 2000-2015 Julian Seward
     12       jseward (at) acm.org
     13 
     14    This program is free software; you can redistribute it and/or
     15    modify it under the terms of the GNU General Public License as
     16    published by the Free Software Foundation; either version 2 of the
     17    License, or (at your option) any later version.
     18 
     19    This program is distributed in the hope that it will be useful, but
     20    WITHOUT ANY WARRANTY; without even the implied warranty of
     21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     22    General Public License for more details.
     23 
     24    You should have received a copy of the GNU General Public License
     25    along with this program; if not, write to the Free Software
     26    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     27    02111-1307, USA.
     28 
     29    The GNU General Public License is contained in the file COPYING.
     30 */
     31 
     32 #ifndef __MC_INCLUDE_H
     33 #define __MC_INCLUDE_H
     34 
     35 #define MC_(str)    VGAPPEND(vgMemCheck_,str)
     36 
     37 
     38 /* This is a private header file for use only within the
     39    memcheck/ directory. */
     40 
     41 /*------------------------------------------------------------*/
     42 /*--- Tracking the heap                                    ---*/
     43 /*------------------------------------------------------------*/
     44 
     45 /* By default, we want at least a 16B redzone on client heap blocks
     46    for Memcheck.
     47    The default can be modified by --redzone-size. */
     48 #define MC_MALLOC_DEFAULT_REDZONE_SZB    16
     49 // effective redzone, as (possibly) modified by --redzone-size:
     50 extern SizeT MC_(Malloc_Redzone_SzB);
     51 
     52 /* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
     53 typedef
     54    enum {
     55       MC_AllocMalloc = 0,
     56       MC_AllocNew    = 1,
     57       MC_AllocNewVec = 2,
     58       MC_AllocCustom = 3
     59    }
     60    MC_AllocKind;
     61 
     62 /* This describes a heap block. Nb: first two fields must match core's
     63  * VgHashNode. */
     64 typedef
     65    struct _MC_Chunk {
     66       struct _MC_Chunk* next;
     67       Addr         data;            // Address of the actual block.
     68       SizeT        szB : (sizeof(SizeT)*8)-2; // Size requested; 30 or 62 bits.
     69       MC_AllocKind allockind : 2;   // Which operation did the allocation.
     70       ExeContext*  where[0];
     71       /* Variable-length array. The size depends on MC_(clo_keep_stacktraces).
     72          This array optionally stores the alloc and/or free stack trace. */
     73    }
     74    MC_Chunk;
     75 
     76 /* Returns the execontext where the MC_Chunk was allocated/freed.
     77    Returns VG_(null_ExeContext)() if the execontext has not been recorded (due
     78    to MC_(clo_keep_stacktraces) and/or because block not yet freed). */
     79 ExeContext* MC_(allocated_at) (MC_Chunk*);
     80 ExeContext* MC_(freed_at) (MC_Chunk*);
     81 
     82 /* Records and sets execontext according to MC_(clo_keep_stacktraces) */
     83 void  MC_(set_allocated_at) (ThreadId, MC_Chunk*);
     84 void  MC_(set_freed_at) (ThreadId, MC_Chunk*);
     85 
     86 /* number of pointers needed according to MC_(clo_keep_stacktraces). */
     87 UInt MC_(n_where_pointers) (void);
     88 
     89 /* Memory pool.  Nb: first two fields must match core's VgHashNode. */
     90 typedef
     91    struct _MC_Mempool {
     92       struct _MC_Mempool* next;
     93       Addr          pool;           // pool identifier
     94       SizeT         rzB;            // pool red-zone size
     95       Bool          is_zeroed;      // allocations from this pool are zeroed
     96       VgHashTable  *chunks;         // chunks associated with this pool
     97    }
     98    MC_Mempool;
     99 
    100 
    101 void* MC_(new_block)  ( ThreadId tid,
    102                         Addr p, SizeT size, SizeT align,
    103                         Bool is_zeroed, MC_AllocKind kind,
    104                         VgHashTable *table);
    105 void MC_(handle_free) ( ThreadId tid,
    106                         Addr p, UInt rzB, MC_AllocKind kind );
    107 
    108 void MC_(create_mempool)  ( Addr pool, UInt rzB, Bool is_zeroed );
    109 void MC_(destroy_mempool) ( Addr pool );
    110 void MC_(mempool_alloc)   ( ThreadId tid, Addr pool,
    111                             Addr addr, SizeT size );
    112 void MC_(mempool_free)    ( Addr pool, Addr addr );
    113 void MC_(mempool_trim)    ( Addr pool, Addr addr, SizeT size );
    114 void MC_(move_mempool)    ( Addr poolA, Addr poolB );
    115 void MC_(mempool_change)  ( Addr pool, Addr addrA, Addr addrB, SizeT size );
    116 Bool MC_(mempool_exists)  ( Addr pool );
    117 
    118 /* Searches for a recently freed block which might bracket Addr a.
    119    Return the MC_Chunk* for this block or NULL if no bracketting block
    120    is found. */
    121 MC_Chunk* MC_(get_freed_block_bracketting)( Addr a );
    122 
    123 /* For efficient pooled alloc/free of the MC_Chunk. */
    124 extern PoolAlloc* MC_(chunk_poolalloc);
    125 
    126 /* For tracking malloc'd blocks.  Nb: it's quite important that it's a
    127    VgHashTable, because VgHashTable allows duplicate keys without complaint.
    128    This can occur if a user marks a malloc() block as also a custom block with
    129    MALLOCLIKE_BLOCK. */
    130 extern VgHashTable *MC_(malloc_list);
    131 
    132 /* For tracking memory pools. */
    133 extern VgHashTable *MC_(mempool_list);
    134 
    135 /* Shadow memory functions */
    136 Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
    137 void MC_(make_mem_noaccess)        ( Addr a, SizeT len );
    138 void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
    139 void MC_(make_mem_defined)         ( Addr a, SizeT len );
    140 void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
    141 
    142 void MC_(print_malloc_stats) ( void );
    143 /* nr of free operations done */
    144 SizeT MC_(get_cmalloc_n_frees) ( void );
    145 
    146 void* MC_(malloc)               ( ThreadId tid, SizeT n );
    147 void* MC_(__builtin_new)        ( ThreadId tid, SizeT n );
    148 void* MC_(__builtin_vec_new)    ( ThreadId tid, SizeT n );
    149 void* MC_(memalign)             ( ThreadId tid, SizeT align, SizeT n );
    150 void* MC_(calloc)               ( ThreadId tid, SizeT nmemb, SizeT size1 );
    151 void  MC_(free)                 ( ThreadId tid, void* p );
    152 void  MC_(__builtin_delete)     ( ThreadId tid, void* p );
    153 void  MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
    154 void* MC_(realloc)              ( ThreadId tid, void* p, SizeT new_size );
    155 SizeT MC_(malloc_usable_size)   ( ThreadId tid, void* p );
    156 
    157 void MC_(handle_resizeInPlace)(ThreadId tid, Addr p,
    158                                SizeT oldSizeB, SizeT newSizeB, SizeT rzB);
    159 
    160 
    161 /*------------------------------------------------------------*/
    162 /*--- Origin tracking translate-time support               ---*/
    163 /*------------------------------------------------------------*/
    164 
    165 /* See detailed comments in mc_machine.c. */
    166 Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
    167 IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
    168 
    169 /* Constants which are used as the lowest 2 bits in origin tags.
    170 
    171    An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
    172    'kind' field.  The ECU field is a number given out by m_execontext
    173    and has a 1-1 mapping with ExeContext*s.  An ECU can be used
    174    directly as an origin tag (otag), but in fact we want to put
    175    additional information 'kind' field to indicate roughly where the
    176    tag came from.  This helps print more understandable error messages
    177    for the user -- it has no other purpose.
    178 
    179    Hence the following 2-bit constants are needed for 'kind' field.
    180 
    181    To summarise:
    182 
    183    * Both ECUs and origin tags are represented as 32-bit words
    184 
    185    * m_execontext and the core-tool interface deal purely in ECUs.
    186      They have no knowledge of origin tags - that is a purely
    187      Memcheck-internal matter.
    188 
    189    * all valid ECUs have the lowest 2 bits zero and at least
    190      one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
    191 
    192    * to convert from an ECU to an otag, OR in one of the MC_OKIND_
    193      constants below
    194 
    195    * to convert an otag back to an ECU, AND it with ~3
    196 */
    197 
    198 #define MC_OKIND_UNKNOWN  0  /* unknown origin */
    199 #define MC_OKIND_HEAP     1  /* this is a heap origin */
    200 #define MC_OKIND_STACK    2  /* this is a stack origin */
    201 #define MC_OKIND_USER     3  /* arises from user-supplied client req */
    202 
    203 
    204 /*------------------------------------------------------------*/
    205 /*--- Profiling of memory events                           ---*/
    206 /*------------------------------------------------------------*/
    207 
    208 /* Define to collect detailed performance info. */
    209 /* #define MC_PROFILE_MEMORY */
    210 #ifdef MC_PROFILE_MEMORY
    211 
    212 /* Order of enumerators does not matter. But MCPE_LAST has to be the
    213    last entry in the list as it is used as an array bound. */
    214 enum {
    215    MCPE_LOADV8,
    216    MCPE_LOADV8_SLOW1,
    217    MCPE_LOADV8_SLOW2,
    218    MCPE_LOADV16,
    219    MCPE_LOADV16_SLOW1,
    220    MCPE_LOADV16_SLOW2,
    221    MCPE_LOADV32,
    222    MCPE_LOADV32_SLOW1,
    223    MCPE_LOADV32_SLOW2,
    224    MCPE_LOADV64,
    225    MCPE_LOADV64_SLOW1,
    226    MCPE_LOADV64_SLOW2,
    227    MCPE_LOADV_128_OR_256,
    228    MCPE_LOADV_128_OR_256_SLOW_LOOP,
    229    MCPE_LOADV_128_OR_256_SLOW1,
    230    MCPE_LOADV_128_OR_256_SLOW2,
    231    MCPE_LOADVN_SLOW,
    232    MCPE_LOADVN_SLOW_LOOP,
    233    MCPE_STOREV8,
    234    MCPE_STOREV8_SLOW1,
    235    MCPE_STOREV8_SLOW2,
    236    MCPE_STOREV8_SLOW3,
    237    MCPE_STOREV8_SLOW4,
    238    MCPE_STOREV16,
    239    MCPE_STOREV16_SLOW1,
    240    MCPE_STOREV16_SLOW2,
    241    MCPE_STOREV16_SLOW3,
    242    MCPE_STOREV16_SLOW4,
    243    MCPE_STOREV32,
    244    MCPE_STOREV32_SLOW1,
    245    MCPE_STOREV32_SLOW2,
    246    MCPE_STOREV32_SLOW3,
    247    MCPE_STOREV32_SLOW4,
    248    MCPE_STOREV64,
    249    MCPE_STOREV64_SLOW1,
    250    MCPE_STOREV64_SLOW2,
    251    MCPE_STOREV64_SLOW3,
    252    MCPE_STOREV64_SLOW4,
    253    MCPE_STOREVN_SLOW,
    254    MCPE_STOREVN_SLOW_LOOP,
    255    MCPE_MAKE_ALIGNED_WORD32_UNDEFINED,
    256    MCPE_MAKE_ALIGNED_WORD32_UNDEFINED_SLOW,
    257    MCPE_MAKE_ALIGNED_WORD64_UNDEFINED,
    258    MCPE_MAKE_ALIGNED_WORD64_UNDEFINED_SLOW,
    259    MCPE_MAKE_ALIGNED_WORD32_NOACCESS,
    260    MCPE_MAKE_ALIGNED_WORD32_NOACCESS_SLOW,
    261    MCPE_MAKE_ALIGNED_WORD64_NOACCESS,
    262    MCPE_MAKE_ALIGNED_WORD64_NOACCESS_SLOW,
    263    MCPE_MAKE_MEM_NOACCESS,
    264    MCPE_MAKE_MEM_UNDEFINED,
    265    MCPE_MAKE_MEM_UNDEFINED_W_OTAG,
    266    MCPE_MAKE_MEM_DEFINED,
    267    MCPE_CHEAP_SANITY_CHECK,
    268    MCPE_EXPENSIVE_SANITY_CHECK,
    269    MCPE_COPY_ADDRESS_RANGE_STATE,
    270    MCPE_COPY_ADDRESS_RANGE_STATE_LOOP1,
    271    MCPE_COPY_ADDRESS_RANGE_STATE_LOOP2,
    272    MCPE_CHECK_MEM_IS_NOACCESS,
    273    MCPE_CHECK_MEM_IS_NOACCESS_LOOP,
    274    MCPE_IS_MEM_ADDRESSABLE,
    275    MCPE_IS_MEM_ADDRESSABLE_LOOP,
    276    MCPE_IS_MEM_DEFINED,
    277    MCPE_IS_MEM_DEFINED_LOOP,
    278    MCPE_IS_MEM_DEFINED_COMPREHENSIVE,
    279    MCPE_IS_MEM_DEFINED_COMPREHENSIVE_LOOP,
    280    MCPE_IS_DEFINED_ASCIIZ,
    281    MCPE_IS_DEFINED_ASCIIZ_LOOP,
    282    MCPE_FIND_CHUNK_FOR_OLD,
    283    MCPE_FIND_CHUNK_FOR_OLD_LOOP,
    284    MCPE_SET_ADDRESS_RANGE_PERMS,
    285    MCPE_SET_ADDRESS_RANGE_PERMS_SINGLE_SECMAP,
    286    MCPE_SET_ADDRESS_RANGE_PERMS_STARTOF_SECMAP,
    287    MCPE_SET_ADDRESS_RANGE_PERMS_MULTIPLE_SECMAPS,
    288    MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM1,
    289    MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM2,
    290    MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM1_QUICK,
    291    MCPE_SET_ADDRESS_RANGE_PERMS_DIST_SM2_QUICK,
    292    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP1A,
    293    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP1B,
    294    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP1C,
    295    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP8A,
    296    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP8B,
    297    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP64K,
    298    MCPE_SET_ADDRESS_RANGE_PERMS_LOOP64K_FREE_DIST_SM,
    299    MCPE_NEW_MEM_STACK,
    300    MCPE_NEW_MEM_STACK_4,
    301    MCPE_NEW_MEM_STACK_8,
    302    MCPE_NEW_MEM_STACK_12,
    303    MCPE_NEW_MEM_STACK_16,
    304    MCPE_NEW_MEM_STACK_32,
    305    MCPE_NEW_MEM_STACK_112,
    306    MCPE_NEW_MEM_STACK_128,
    307    MCPE_NEW_MEM_STACK_144,
    308    MCPE_NEW_MEM_STACK_160,
    309    MCPE_DIE_MEM_STACK,
    310    MCPE_DIE_MEM_STACK_4,
    311    MCPE_DIE_MEM_STACK_8,
    312    MCPE_DIE_MEM_STACK_12,
    313    MCPE_DIE_MEM_STACK_16,
    314    MCPE_DIE_MEM_STACK_32,
    315    MCPE_DIE_MEM_STACK_112,
    316    MCPE_DIE_MEM_STACK_128,
    317    MCPE_DIE_MEM_STACK_144,
    318    MCPE_DIE_MEM_STACK_160,
    319    /* Do not add enumerators past this line. */
    320    MCPE_LAST
    321 };
    322 
    323 extern ULong MC_(event_ctr)[MCPE_LAST];
    324 
    325 #  define PROF_EVENT(ev)                           \
    326    do { tl_assert((ev) >= 0 && (ev) < MCPE_LAST);  \
    327       MC_(event_ctr)[ev]++;                        \
    328    } while (False);
    329 
    330 #else
    331 
    332 #  define PROF_EVENT(ev)    /* */
    333 
    334 #endif   /* MC_PROFILE_MEMORY */
    335 
    336 
    337 /*------------------------------------------------------------*/
    338 /*--- V and A bits (Victoria & Albert ?)                   ---*/
    339 /*------------------------------------------------------------*/
    340 
    341 /* The number of entries in the primary map can be altered.  However
    342    we hardwire the assumption that each secondary map covers precisely
    343    64k of address space. */
    344 #define SM_SIZE 65536            /* DO NOT CHANGE */
    345 #define SM_MASK (SM_SIZE-1)      /* DO NOT CHANGE */
    346 
    347 #define V_BIT_DEFINED         0
    348 #define V_BIT_UNDEFINED       1
    349 
    350 #define V_BITS8_DEFINED       0
    351 #define V_BITS8_UNDEFINED     0xFF
    352 
    353 #define V_BITS16_DEFINED      0
    354 #define V_BITS16_UNDEFINED    0xFFFF
    355 
    356 #define V_BITS32_DEFINED      0
    357 #define V_BITS32_UNDEFINED    0xFFFFFFFF
    358 
    359 #define V_BITS64_DEFINED      0ULL
    360 #define V_BITS64_UNDEFINED    0xFFFFFFFFFFFFFFFFULL
    361 
    362 
    363 /*------------------------------------------------------------*/
    364 /*--- Leak checking                                        ---*/
    365 /*------------------------------------------------------------*/
    366 
    367 typedef
    368    enum {
    369       // Nb: the order is important -- it dictates the order of loss records
    370       // of equal sizes.
    371       Reachable    =0,  // Definitely reachable from root-set.
    372       Possible     =1,  // Possibly reachable from root-set;  involves at
    373                         //   least one interior-pointer along the way.
    374       IndirectLeak =2,  // Leaked, but reachable from another leaked block
    375                         //   (be it Unreached or IndirectLeak).
    376       Unreached    =3,  // Not reached, ie. leaked.
    377                         //   (At best, only reachable from itself via a cycle.)
    378   }
    379   Reachedness;
    380 
    381 // Build mask to check or set Reachedness r membership
    382 #define R2S(r) (1 << (r))
    383 // Reachedness r is member of the Set s ?
    384 #define RiS(r,s) ((s) & R2S(r))
    385 // Returns a set containing all Reachedness
    386 UInt MC_(all_Reachedness)(void);
    387 
    388 /* For VALGRIND_COUNT_LEAKS client request */
    389 extern SizeT MC_(bytes_leaked);
    390 extern SizeT MC_(bytes_indirect);
    391 extern SizeT MC_(bytes_dubious);
    392 extern SizeT MC_(bytes_reachable);
    393 extern SizeT MC_(bytes_suppressed);
    394 
    395 /* For VALGRIND_COUNT_LEAK_BLOCKS client request */
    396 extern SizeT MC_(blocks_leaked);
    397 extern SizeT MC_(blocks_indirect);
    398 extern SizeT MC_(blocks_dubious);
    399 extern SizeT MC_(blocks_reachable);
    400 extern SizeT MC_(blocks_suppressed);
    401 
    402 typedef
    403    enum {
    404       LC_Off,
    405       LC_Summary,
    406       LC_Full,
    407    }
    408    LeakCheckMode;
    409 
    410 typedef
    411    enum {
    412       LCD_Any,       // output all loss records, whatever the delta
    413       LCD_Increased, // output loss records with an increase in size or blocks
    414       LCD_Changed,   // output loss records with an increase or
    415                      //decrease in size or blocks
    416    }
    417    LeakCheckDeltaMode;
    418 
    419 /* When a LossRecord is put into an OSet, these elements represent the key. */
    420 typedef
    421    struct _LossRecordKey {
    422       Reachedness  state;        // LC_Extra.state value shared by all blocks.
    423       ExeContext*  allocated_at; // Where they were allocated.
    424    }
    425    LossRecordKey;
    426 
    427 /* A loss record, used for generating err msgs.  Multiple leaked blocks can be
    428  * merged into a single loss record if they have the same state and similar
    429  * enough allocation points (controlled by --leak-resolution). */
    430 typedef
    431    struct _LossRecord {
    432       LossRecordKey key;  // Key, when used in an OSet.
    433       SizeT szB;          // Sum of all MC_Chunk.szB values.
    434       SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
    435       UInt  num_blocks;   // Number of blocks represented by the record.
    436       SizeT old_szB;          // old_* values are the values found during the
    437       SizeT old_indirect_szB; // previous leak search. old_* values are used to
    438       UInt  old_num_blocks;   // output only the changed/new loss records
    439    }
    440    LossRecord;
    441 
    442 typedef
    443    struct _LeakCheckParams {
    444       LeakCheckMode mode;
    445       UInt show_leak_kinds;
    446       UInt errors_for_leak_kinds;
    447       UInt heuristics;
    448       LeakCheckDeltaMode deltamode;
    449       UInt max_loss_records_output; // limit on the nr of loss records output.
    450       Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
    451    }
    452    LeakCheckParams;
    453 
    454 void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams * lcp);
    455 
    456 // Each time a leak search is done, the leak search generation
    457 // MC_(leak_search_gen) is incremented.
    458 extern UInt MC_(leak_search_gen);
    459 
    460 // maintains the lcp.deltamode given in the last call to detect_memory_leaks
    461 extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
    462 
    463 // prints the list of blocks corresponding to the given loss_record_nr slice
    464 // (from/to) (up to maximum max_blocks)
    465 // Returns True if loss_record_nr_from identifies a correct loss record
    466 // from last leak search, returns False otherwise.
    467 // Note that loss_record_nr_to can be bigger than the nr of loss records. All
    468 // loss records after from will then be examined and maybe printed.
    469 // If heuristics != 0, print only the loss records/blocks found via
    470 // one of the heuristics in the set.
    471 Bool MC_(print_block_list) ( UInt loss_record_nr_from, UInt loss_record_nr_to,
    472                              UInt max_blocks, UInt heuristics);
    473 
    474 // Prints the addresses/registers/... at which a pointer to
    475 // the given range [address, address+szB[ is found.
    476 void MC_(who_points_at) ( Addr address, SizeT szB);
    477 
    478 // if delta_mode == LCD_Any, prints in buf an empty string
    479 // otherwise prints a delta in the layout  " (+%'lu)" or " (-%'lu)"
    480 extern HChar * MC_(snprintf_delta) (HChar * buf, Int size,
    481                                     SizeT current_val, SizeT old_val,
    482                                     LeakCheckDeltaMode delta_mode);
    483 
    484 
    485 Bool MC_(is_valid_aligned_word)     ( Addr a );
    486 Bool MC_(is_within_valid_secondary) ( Addr a );
    487 
    488 // Prints as user msg a description of the given loss record.
    489 void MC_(pp_LossRecord)(UInt n_this_record, UInt n_total_records,
    490                         LossRecord* l);
    491 
    492 
    493 /*------------------------------------------------------------*/
    494 /*--- Errors and suppressions                              ---*/
    495 /*------------------------------------------------------------*/
    496 
    497 /* Did we show to the user, any errors for which an uninitialised
    498    value origin could have been collected (but wasn't) ?  If yes,
    499    then, at the end of the run, print a 1 line message advising that a
    500    rerun with --track-origins=yes might help. */
    501 extern Bool MC_(any_value_errors);
    502 
    503 /* Standard functions for error and suppressions as required by the
    504    core/tool iface */
    505 Bool MC_(eq_Error)           ( VgRes res, const Error* e1, const Error* e2 );
    506 void MC_(before_pp_Error)    ( const Error* err );
    507 void MC_(pp_Error)           ( const Error* err );
    508 UInt MC_(update_Error_extra) ( const Error* err );
    509 
    510 Bool MC_(is_recognised_suppression) ( const HChar* name, Supp* su );
    511 
    512 Bool MC_(read_extra_suppression_info) ( Int fd, HChar** buf,
    513                                         SizeT* nBuf, Int* lineno, Supp *su );
    514 
    515 Bool MC_(error_matches_suppression) ( const Error* err, const Supp* su );
    516 
    517 SizeT MC_(get_extra_suppression_info) ( const Error* err,
    518                                         /*OUT*/HChar* buf, Int nBuf );
    519 SizeT MC_(print_extra_suppression_use) ( const Supp* su,
    520                                          /*OUT*/HChar* buf, Int nBuf );
    521 void MC_(update_extra_suppression_use) ( const Error* err, const Supp* su );
    522 
    523 const HChar* MC_(get_error_name) ( const Error* err );
    524 
    525 /* Recording of errors */
    526 void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
    527                                  Bool isWrite );
    528 void MC_(record_cond_error)    ( ThreadId tid, UInt otag );
    529 void MC_(record_value_error)   ( ThreadId tid, Int szB, UInt otag );
    530 void MC_(record_jump_error)    ( ThreadId tid, Addr a );
    531 
    532 void MC_(record_free_error)            ( ThreadId tid, Addr a );
    533 void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
    534 void MC_(record_freemismatch_error)    ( ThreadId tid, MC_Chunk* mc );
    535 
    536 void MC_(record_overlap_error)  ( ThreadId tid, const HChar* function,
    537                                   Addr src, Addr dst, SizeT szB );
    538 void MC_(record_core_mem_error) ( ThreadId tid, const HChar* msg );
    539 void MC_(record_regparam_error) ( ThreadId tid, const HChar* msg, UInt otag );
    540 void MC_(record_memparam_error) ( ThreadId tid, Addr a,
    541                                   Bool isAddrErr, const HChar* msg, UInt otag );
    542 void MC_(record_user_error)     ( ThreadId tid, Addr a,
    543                                   Bool isAddrErr, UInt otag );
    544 
    545 Bool MC_(record_leak_error)     ( ThreadId tid,
    546                                   UInt n_this_record,
    547                                   UInt n_total_records,
    548                                   LossRecord* lossRecord,
    549                                   Bool print_record,
    550                                   Bool count_error );
    551 
    552 Bool MC_(record_fishy_value_error)  ( ThreadId tid, const HChar* function,
    553                                       const HChar *argument_name, SizeT value );
    554 
    555 /* Leak kinds tokens to call VG_(parse_enum_set). */
    556 extern const HChar* MC_(parse_leak_kinds_tokens);
    557 
    558 /* prints a description of address a */
    559 void MC_(pp_describe_addr) (Addr a);
    560 
    561 /* Is this address in a user-specified "ignored range" ? */
    562 Bool MC_(in_ignored_range) ( Addr a );
    563 
    564 
    565 /*------------------------------------------------------------*/
    566 /*--- Client blocks                                        ---*/
    567 /*------------------------------------------------------------*/
    568 
    569 /* Describes a client block.  See mc_main.c.  An unused block has
    570    start == size == 0.  */
    571 typedef
    572    struct {
    573       Addr        start;
    574       SizeT       size;
    575       ExeContext* where;
    576       HChar*      desc;
    577    }
    578    CGenBlock;
    579 
    580 /* Get access to the client block array. */
    581 void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
    582                                  /*OUT*/UWord* nBlocks );
    583 
    584 
    585 /*------------------------------------------------------------*/
    586 /*--- Command line options + defaults                      ---*/
    587 /*------------------------------------------------------------*/
    588 
    589 /* Allow loads from partially-valid addresses?  default: YES */
    590 extern Bool MC_(clo_partial_loads_ok);
    591 
    592 /* Max volume of the freed blocks queue. */
    593 extern Long MC_(clo_freelist_vol);
    594 
    595 /* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put
    596    in the "big block" freed blocks queue. */
    597 extern Long MC_(clo_freelist_big_blocks);
    598 
    599 /* Do leak check at exit?  default: NO */
    600 extern LeakCheckMode MC_(clo_leak_check);
    601 
    602 /* How closely should we compare ExeContexts in leak records? default: 2 */
    603 extern VgRes MC_(clo_leak_resolution);
    604 
    605 /* In leak check, show loss records if their R2S(reachedness) is set.
    606    Default : R2S(Possible) | R2S(Unreached). */
    607 extern UInt MC_(clo_show_leak_kinds);
    608 
    609 /* In leak check, a loss record is an error if its R2S(reachedness) is set.
    610    Default : R2S(Possible) | R2S(Unreached). */
    611 extern UInt MC_(clo_errors_for_leak_kinds);
    612 
    613 /* Various leak check heuristics which can be activated/deactivated. */
    614 typedef
    615    enum {
    616       LchNone                =0,
    617       // no heuristic.
    618       LchStdString           =1,
    619       // Consider interior pointer pointing at the array of char in a
    620       // std::string as reachable.
    621       LchLength64            =2,
    622       // Consider interior pointer pointing at offset 64bit of a block as
    623       // reachable, when the first 8 bytes contains the block size - 8.
    624       // Such length+interior pointers are used by e.g. sqlite3MemMalloc.
    625       // On 64bit platforms LchNewArray will also match these blocks.
    626       LchNewArray            =3,
    627       // Consider interior pointer pointing at second word of a new[] array as
    628       // reachable. Such interior pointers are used for arrays whose elements
    629       // have a destructor.
    630       LchMultipleInheritance =4,
    631       // Conside interior pointer pointing just after what looks a vtable
    632       // as reachable.
    633   }
    634   LeakCheckHeuristic;
    635 
    636 // Nr of heuristics, including the LchNone heuristic.
    637 #define N_LEAK_CHECK_HEURISTICS 5
    638 
    639 // Build mask to check or set Heuristic h membership
    640 #define H2S(h) (1 << (h))
    641 // Heuristic h is member of the Set s ?
    642 #define HiS(h,s) ((s) & H2S(h))
    643 
    644 /* Heuristics set to use for the leak search.
    645    Default : all heuristics. */
    646 extern UInt MC_(clo_leak_check_heuristics);
    647 
    648 /* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
    649  * default: NO */
    650 extern Bool MC_(clo_workaround_gcc296_bugs);
    651 
    652 /* Fill malloc-d/free-d client blocks with a specific value?  -1 if
    653    not, else 0x00 .. 0xFF indicating the fill value to use.  Can be
    654    useful for causing programs with bad heap corruption to fail in
    655    more repeatable ways.  Note that malloc-filled and free-filled
    656    areas are still undefined and noaccess respectively.  This merely
    657    causes them to contain the specified values. */
    658 extern Int MC_(clo_malloc_fill);
    659 extern Int MC_(clo_free_fill);
    660 
    661 /* Which stack trace(s) to keep for malloc'd/free'd client blocks?
    662    For each client block, the stack traces where it was allocated
    663    and/or freed are optionally kept depending on MC_(clo_keep_stacktraces). */
    664 typedef
    665    enum {                 // keep alloc stack trace ?  keep free stack trace ?
    666       KS_none,            // never                     never
    667       KS_alloc,           // always                    never
    668       KS_free,            // never                     always
    669       KS_alloc_then_free, // when still malloc'd       when free'd
    670       KS_alloc_and_free,  // always                    always
    671    }
    672    KeepStacktraces;
    673 extern KeepStacktraces MC_(clo_keep_stacktraces);
    674 
    675 /* Indicates the level of instrumentation/checking done by Memcheck.
    676 
    677    1 = No undefined value checking, Addrcheck-style behaviour only:
    678        only address checking is done.  This is faster but finds fewer
    679        errors.  Note that although Addrcheck had 1 bit per byte
    680        overhead vs the old Memcheck's 9 bits per byte, with this mode
    681        and compressed V bits, no memory is saved with this mode --
    682        it's still 2 bits per byte overhead.  This is a little wasteful
    683        -- it could be done with 1 bit per byte -- but lets us reuse
    684        the many shadow memory access functions.  Note that in this
    685        mode neither the secondary V bit table nor the origin-tag cache
    686        are used.
    687 
    688    2 = Address checking and Undefined value checking are performed,
    689        but origins are not tracked.  So the origin-tag cache is not
    690        used in this mode.  This setting is the default and corresponds
    691        to the "normal" Memcheck behaviour that has shipped for years.
    692 
    693    3 = Address checking, undefined value checking, and origins for
    694        undefined values are tracked.
    695 
    696    The default is 2.
    697 */
    698 extern Int MC_(clo_mc_level);
    699 
    700 /* Should we show mismatched frees?  Default: YES */
    701 extern Bool MC_(clo_show_mismatched_frees);
    702 
    703 /* Should we use expensive definedness checking for add/sub and compare
    704    operations? Default: NO */
    705 extern Bool MC_(clo_expensive_definedness_checks);
    706 
    707 /*------------------------------------------------------------*/
    708 /*--- Instrumentation                                      ---*/
    709 /*------------------------------------------------------------*/
    710 
    711 /* Functions defined in mc_main.c */
    712 
    713 /* For the fail_w_o functions, the UWord arg is actually the 32-bit
    714    origin tag and should really be UInt, but to be simple and safe
    715    considering it's called from generated code, just claim it to be a
    716    UWord. */
    717 VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
    718 VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
    719 VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
    720 VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
    721 VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
    722 
    723 /* And call these ones instead to report an uninitialised value error
    724    but with no origin available. */
    725 VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
    726 VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
    727 VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
    728 VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
    729 VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
    730 
    731 /* V-bits load/store helpers */
    732 VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
    733 VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
    734 VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
    735 VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
    736 VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
    737 VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
    738 VG_REGPARM(2) void MC_(helperc_STOREV8)    ( Addr, UWord );
    739 
    740 VG_REGPARM(2) void  MC_(helperc_LOADV256be) ( /*OUT*/V256*, Addr );
    741 VG_REGPARM(2) void  MC_(helperc_LOADV256le) ( /*OUT*/V256*, Addr );
    742 VG_REGPARM(2) void  MC_(helperc_LOADV128be) ( /*OUT*/V128*, Addr );
    743 VG_REGPARM(2) void  MC_(helperc_LOADV128le) ( /*OUT*/V128*, Addr );
    744 VG_REGPARM(1) ULong MC_(helperc_LOADV64be)  ( Addr );
    745 VG_REGPARM(1) ULong MC_(helperc_LOADV64le)  ( Addr );
    746 VG_REGPARM(1) UWord MC_(helperc_LOADV32be)  ( Addr );
    747 VG_REGPARM(1) UWord MC_(helperc_LOADV32le)  ( Addr );
    748 VG_REGPARM(1) UWord MC_(helperc_LOADV16be)  ( Addr );
    749 VG_REGPARM(1) UWord MC_(helperc_LOADV16le)  ( Addr );
    750 VG_REGPARM(1) UWord MC_(helperc_LOADV8)     ( Addr );
    751 
    752 void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
    753                                                  Addr nia );
    754 
    755 /* Origin tag load/store helpers */
    756 VG_REGPARM(2) void  MC_(helperc_b_store1) ( Addr a, UWord d32 );
    757 VG_REGPARM(2) void  MC_(helperc_b_store2) ( Addr a, UWord d32 );
    758 VG_REGPARM(2) void  MC_(helperc_b_store4) ( Addr a, UWord d32 );
    759 VG_REGPARM(2) void  MC_(helperc_b_store8) ( Addr a, UWord d32 );
    760 VG_REGPARM(2) void  MC_(helperc_b_store16)( Addr a, UWord d32 );
    761 VG_REGPARM(2) void  MC_(helperc_b_store32)( Addr a, UWord d32 );
    762 VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
    763 VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
    764 VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
    765 VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
    766 VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
    767 VG_REGPARM(1) UWord MC_(helperc_b_load32)( Addr a );
    768 
    769 /* Functions defined in mc_translate.c */
    770 IRSB* MC_(instrument) ( VgCallbackClosure* closure,
    771                         IRSB* bb_in,
    772                         const VexGuestLayout* layout,
    773                         const VexGuestExtents* vge,
    774                         const VexArchInfo* archinfo_host,
    775                         IRType gWordTy, IRType hWordTy );
    776 
    777 IRSB* MC_(final_tidy) ( IRSB* );
    778 
    779 #endif /* ndef __MC_INCLUDE_H */
    780 
    781 /*--------------------------------------------------------------------*/
    782 /*--- end                                                          ---*/
    783 /*--------------------------------------------------------------------*/
    784