2 /*--------------------------------------------------------------------*/
3 /*--- A header file for all parts of the MemCheck tool. ---*/
4 /*--- mc_include.h ---*/
5 /*--------------------------------------------------------------------*/
8 This file is part of MemCheck, a heavyweight Valgrind tool for
9 detecting memory errors.
11 Copyright (C) 2000-2010 Julian Seward
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.
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.
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
29 The GNU General Public License is contained in the file COPYING.
32 #ifndef __MC_INCLUDE_H
33 #define __MC_INCLUDE_H
35 #define MC_(str) VGAPPEND(vgMemCheck_,str)
38 /* This is a private header file for use only within the
39 memcheck/ directory. */
41 /*------------------------------------------------------------*/
42 /*--- Tracking the heap ---*/
43 /*------------------------------------------------------------*/
45 /* We want at least a 16B redzone on client heap blocks for Memcheck */
46 #define MC_MALLOC_REDZONE_SZB 16
48 /* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
58 /* This describes a heap block. Nb: first two fields must match core's
62 struct _MC_Chunk* next;
63 Addr data; // Address of the actual block.
64 SizeT szB : (sizeof(SizeT)*8)-2; // Size requested; 30 or 62 bits.
65 MC_AllocKind allockind : 2; // Which operation did the allocation.
66 ExeContext* where; // Where it was allocated.
70 /* Memory pool. Nb: first two fields must match core's VgHashNode. */
73 struct _MC_Mempool* next;
74 Addr pool; // pool identifier
75 SizeT rzB; // pool red-zone size
76 Bool is_zeroed; // allocations from this pool are zeroed
77 VgHashTable chunks; // chunks associated with this pool
82 void* MC_(new_block) ( ThreadId tid,
83 Addr p, SizeT size, SizeT align,
84 Bool is_zeroed, MC_AllocKind kind,
86 void MC_(handle_free) ( ThreadId tid,
87 Addr p, UInt rzB, MC_AllocKind kind );
89 void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
90 void MC_(destroy_mempool) ( Addr pool );
91 void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
92 Addr addr, SizeT size );
93 void MC_(mempool_free) ( Addr pool, Addr addr );
94 void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
95 void MC_(move_mempool) ( Addr poolA, Addr poolB );
96 void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
97 Bool MC_(mempool_exists) ( Addr pool );
99 MC_Chunk* MC_(get_freed_list_head)( void );
101 /* For tracking malloc'd blocks. Nb: it's quite important that it's a
102 VgHashTable, because VgHashTable allows duplicate keys without complaint.
103 This can occur if a user marks a malloc() block as also a custom block with
105 extern VgHashTable MC_(malloc_list);
107 /* For tracking memory pools. */
108 extern VgHashTable MC_(mempool_list);
110 /* Shadow memory functions */
111 Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
112 void MC_(make_mem_noaccess) ( Addr a, SizeT len );
113 void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
114 void MC_(make_mem_defined) ( Addr a, SizeT len );
115 void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
117 void MC_(print_malloc_stats) ( void );
119 void* MC_(malloc) ( ThreadId tid, SizeT n );
120 void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
121 void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
122 void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
123 void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
124 void MC_(free) ( ThreadId tid, void* p );
125 void MC_(__builtin_delete) ( ThreadId tid, void* p );
126 void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
127 void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
128 SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p );
131 /*------------------------------------------------------------*/
132 /*--- Origin tracking translate-time support ---*/
133 /*------------------------------------------------------------*/
135 /* See detailed comments in mc_machine.c. */
136 Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
137 IRType MC_(get_otrack_reg_array_equiv_int_type) ( IRRegArray* arr );
139 /* Constants which are used as the lowest 2 bits in origin tags.
141 An origin tag comprises an upper 30-bit ECU field and a lower 2-bit
142 'kind' field. The ECU field is a number given out by m_execontext
143 and has a 1-1 mapping with ExeContext*s. An ECU can be used
144 directly as an origin tag (otag), but in fact we want to put
145 additional information 'kind' field to indicate roughly where the
146 tag came from. This helps print more understandable error messages
147 for the user -- it has no other purpose.
149 Hence the following 2-bit constants are needed for 'kind' field.
153 * Both ECUs and origin tags are represented as 32-bit words
155 * m_execontext and the core-tool interface deal purely in ECUs.
156 They have no knowledge of origin tags - that is a purely
157 Memcheck-internal matter.
159 * all valid ECUs have the lowest 2 bits zero and at least
160 one of the upper 30 bits nonzero (see VG_(is_plausible_ECU))
162 * to convert from an ECU to an otag, OR in one of the MC_OKIND_
165 * to convert an otag back to an ECU, AND it with ~3
168 #define MC_OKIND_UNKNOWN 0 /* unknown origin */
169 #define MC_OKIND_HEAP 1 /* this is a heap origin */
170 #define MC_OKIND_STACK 2 /* this is a stack origin */
171 #define MC_OKIND_USER 3 /* arises from user-supplied client req */
174 /*------------------------------------------------------------*/
175 /*--- Profiling of memory events ---*/
176 /*------------------------------------------------------------*/
178 /* Define to collect detailed performance info. */
179 /* #define MC_PROFILE_MEMORY */
181 #ifdef MC_PROFILE_MEMORY
182 # define N_PROF_EVENTS 500
184 UInt MC_(event_ctr)[N_PROF_EVENTS];
185 HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
187 # define PROF_EVENT(ev, name) \
188 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
189 /* crude and inaccurate check to ensure the same */ \
190 /* event isn't being used with > 1 name */ \
191 if (MC_(event_ctr_name)[ev]) \
192 tl_assert(name == MC_(event_ctr_name)[ev]); \
193 MC_(event_ctr)[ev]++; \
194 MC_(event_ctr_name)[ev] = (name); \
199 # define PROF_EVENT(ev, name) /* */
201 #endif /* MC_PROFILE_MEMORY */
204 /*------------------------------------------------------------*/
205 /*--- V and A bits (Victoria & Albert ?) ---*/
206 /*------------------------------------------------------------*/
208 /* The number of entries in the primary map can be altered. However
209 we hardwire the assumption that each secondary map covers precisely
210 64k of address space. */
211 #define SM_SIZE 65536 /* DO NOT CHANGE */
212 #define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
214 #define V_BIT_DEFINED 0
215 #define V_BIT_UNDEFINED 1
217 #define V_BITS8_DEFINED 0
218 #define V_BITS8_UNDEFINED 0xFF
220 #define V_BITS16_DEFINED 0
221 #define V_BITS16_UNDEFINED 0xFFFF
223 #define V_BITS32_DEFINED 0
224 #define V_BITS32_UNDEFINED 0xFFFFFFFF
226 #define V_BITS64_DEFINED 0ULL
227 #define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
230 /*------------------------------------------------------------*/
231 /*--- Leak checking ---*/
232 /*------------------------------------------------------------*/
236 // Nb: the order is important -- it dictates the order of loss records
238 Reachable =0, // Definitely reachable from root-set.
239 Possible =1, // Possibly reachable from root-set; involves at
240 // least one interior-pointer along the way.
241 IndirectLeak =2, // Leaked, but reachable from another leaked block
242 // (be it Unreached or IndirectLeak).
243 Unreached =3, // Not reached, ie. leaked.
244 // (At best, only reachable from itself via a cycle.)
248 /* For VALGRIND_COUNT_LEAKS client request */
249 extern SizeT MC_(bytes_leaked);
250 extern SizeT MC_(bytes_indirect);
251 extern SizeT MC_(bytes_dubious);
252 extern SizeT MC_(bytes_reachable);
253 extern SizeT MC_(bytes_suppressed);
255 /* For VALGRIND_COUNT_LEAK_BLOCKS client request */
256 extern SizeT MC_(blocks_leaked);
257 extern SizeT MC_(blocks_indirect);
258 extern SizeT MC_(blocks_dubious);
259 extern SizeT MC_(blocks_reachable);
260 extern SizeT MC_(blocks_suppressed);
270 /* When a LossRecord is put into an OSet, these elements represent the key. */
272 struct _LossRecordKey {
273 Reachedness state; // LC_Extra.state value shared by all blocks.
274 ExeContext* allocated_at; // Where they were allocated.
278 /* A loss record, used for generating err msgs. Multiple leaked blocks can be
279 * merged into a single loss record if they have the same state and similar
280 * enough allocation points (controlled by --leak-resolution). */
283 LossRecordKey key; // Key, when used in an OSet.
284 SizeT szB; // Sum of all MC_Chunk.szB values.
285 SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
286 UInt num_blocks; // Number of blocks represented by the record.
290 void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckMode mode );
292 Bool MC_(is_valid_aligned_word) ( Addr a );
293 Bool MC_(is_within_valid_secondary) ( Addr a );
295 void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
299 /*------------------------------------------------------------*/
300 /*--- Errors and suppressions ---*/
301 /*------------------------------------------------------------*/
303 /* Did we show to the user, any errors for which an uninitialised
304 value origin could have been collected (but wasn't) ? If yes,
305 then, at the end of the run, print a 1 line message advising that a
306 rerun with --track-origins=yes might help. */
307 extern Bool MC_(any_value_errors);
309 /* Standard functions for error and suppressions as required by the
311 Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
312 void MC_(before_pp_Error) ( Error* err );
313 void MC_(pp_Error) ( Error* err );
314 UInt MC_(update_Error_extra) ( Error* err );
316 Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
318 Bool MC_(read_extra_suppression_info) ( Int fd, Char** buf,
319 SizeT* nBuf, Supp *su );
321 Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
323 Bool MC_(get_extra_suppression_info) ( Error* err,
324 /*OUT*/Char* buf, Int nBuf );
326 Char* MC_(get_error_name) ( Error* err );
328 /* Recording of errors */
329 void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
331 void MC_(record_cond_error) ( ThreadId tid, UInt otag );
332 void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
333 void MC_(record_jump_error) ( ThreadId tid, Addr a );
335 void MC_(record_free_error) ( ThreadId tid, Addr a );
336 void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
337 void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
339 void MC_(record_overlap_error) ( ThreadId tid, Char* function,
340 Addr src, Addr dst, SizeT szB );
341 void MC_(record_core_mem_error) ( ThreadId tid, Char* msg );
342 void MC_(record_regparam_error) ( ThreadId tid, Char* msg, UInt otag );
343 void MC_(record_memparam_error) ( ThreadId tid, Addr a,
344 Bool isAddrErr, Char* msg, UInt otag );
345 void MC_(record_user_error) ( ThreadId tid, Addr a,
346 Bool isAddrErr, UInt otag );
348 Bool MC_(record_leak_error) ( ThreadId tid,
350 UInt n_total_records,
351 LossRecord* lossRecord,
355 /* Is this address in a user-specified "ignored range" ? */
356 Bool MC_(in_ignored_range) ( Addr a );
359 /*------------------------------------------------------------*/
360 /*--- Client blocks ---*/
361 /*------------------------------------------------------------*/
363 /* Describes a client block. See mc_main.c. An unused block has
364 start == size == 0. */
374 /* Get access to the client block array. */
375 void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
376 /*OUT*/UWord* nBlocks );
379 /*------------------------------------------------------------*/
380 /*--- Command line options + defaults ---*/
381 /*------------------------------------------------------------*/
383 /* Allow loads from partially-valid addresses? default: YES */
384 extern Bool MC_(clo_partial_loads_ok);
386 /* Max volume of the freed blocks queue. */
387 extern Long MC_(clo_freelist_vol);
389 /* Do leak check at exit? default: NO */
390 extern LeakCheckMode MC_(clo_leak_check);
392 /* How closely should we compare ExeContexts in leak records? default: 2 */
393 extern VgRes MC_(clo_leak_resolution);
395 /* In leak check, show reachable-but-not-freed blocks? default: NO */
396 extern Bool MC_(clo_show_reachable);
398 /* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
400 extern Bool MC_(clo_workaround_gcc296_bugs);
402 /* Fill malloc-d/free-d client blocks with a specific value? -1 if
403 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
404 useful for causing programs with bad heap corruption to fail in
405 more repeatable ways. Note that malloc-filled and free-filled
406 areas are still undefined and noaccess respectively. This merely
407 causes them to contain the specified values. */
408 extern Int MC_(clo_malloc_fill);
409 extern Int MC_(clo_free_fill);
411 /* Indicates the level of instrumentation/checking done by Memcheck.
413 1 = No undefined value checking, Addrcheck-style behaviour only:
414 only address checking is done. This is faster but finds fewer
415 errors. Note that although Addrcheck had 1 bit per byte
416 overhead vs the old Memcheck's 9 bits per byte, with this mode
417 and compressed V bits, no memory is saved with this mode --
418 it's still 2 bits per byte overhead. This is a little wasteful
419 -- it could be done with 1 bit per byte -- but lets us reuse
420 the many shadow memory access functions. Note that in this
421 mode neither the secondary V bit table nor the origin-tag cache
424 2 = Address checking and Undefined value checking are performed,
425 but origins are not tracked. So the origin-tag cache is not
426 used in this mode. This setting is the default and corresponds
427 to the "normal" Memcheck behaviour that has shipped for years.
429 3 = Address checking, undefined value checking, and origins for
430 undefined values are tracked.
434 extern Int MC_(clo_mc_level);
437 /*------------------------------------------------------------*/
438 /*--- Instrumentation ---*/
439 /*------------------------------------------------------------*/
441 /* Functions defined in mc_main.c */
443 /* For the fail_w_o functions, the UWord arg is actually the 32-bit
444 origin tag and should really be UInt, but to be simple and safe
445 considering it's called from generated code, just claim it to be a
447 VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
448 VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
449 VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
450 VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
451 VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
453 /* And call these ones instead to report an uninitialised value error
454 but with no origin available. */
455 VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
456 VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
457 VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
458 VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
459 VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
461 /* V-bits load/store helpers */
462 VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
463 VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
464 VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
465 VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
466 VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
467 VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
468 VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
470 VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
471 VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
472 VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
473 VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
474 VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
475 VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
476 VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
478 void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
481 /* Origin tag load/store helpers */
482 VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
483 VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
484 VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
485 VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
486 VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
487 VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
488 VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
489 VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
490 VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
491 VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
493 /* Functions defined in mc_translate.c */
494 IRSB* MC_(instrument) ( VgCallbackClosure* closure,
496 VexGuestLayout* layout,
497 VexGuestExtents* vge,
498 IRType gWordTy, IRType hWordTy );
500 IRSB* MC_(final_tidy) ( IRSB* );
502 #endif /* ndef __MC_INCLUDE_H */
504 /*--------------------------------------------------------------------*/
506 /*--------------------------------------------------------------------*/