blob: 3493fb5bcd5d4eab97e2b99be73c15a605ae63ea [file] [log] [blame]
njnc9539842002-10-02 13:26:35 +00001
njn25e49d8e72002-09-23 09:36:25 +00002/*--------------------------------------------------------------------*/
nethercote137bc552003-11-14 17:47:54 +00003/*--- A header file for all parts of the MemCheck tool. ---*/
njn25cac76cb2002-09-23 11:21:57 +00004/*--- mc_include.h ---*/
njn25e49d8e72002-09-23 09:36:25 +00005/*--------------------------------------------------------------------*/
6
7/*
nethercote137bc552003-11-14 17:47:54 +00008 This file is part of MemCheck, a heavyweight Valgrind tool for
njnc9539842002-10-02 13:26:35 +00009 detecting memory errors.
njn25e49d8e72002-09-23 09:36:25 +000010
sewardj0f157dd2013-10-18 14:27:36 +000011 Copyright (C) 2000-2013 Julian Seward
njn25e49d8e72002-09-23 09:36:25 +000012 jseward@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
njn25cac76cb2002-09-23 11:21:57 +000032#ifndef __MC_INCLUDE_H
33#define __MC_INCLUDE_H
njn25e49d8e72002-09-23 09:36:25 +000034
njn44acd3e2005-05-13 21:39:45 +000035#define MC_(str) VGAPPEND(vgMemCheck_,str)
njn25e49d8e72002-09-23 09:36:25 +000036
sewardj7ce71662008-05-02 10:33:15 +000037
38/* This is a private header file for use only within the
39 memcheck/ directory. */
40
njn25e49d8e72002-09-23 09:36:25 +000041/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +000042/*--- Tracking the heap ---*/
njn43c799e2003-04-08 00:08:52 +000043/*------------------------------------------------------------*/
44
philipped99c26a2012-07-31 22:17:28 +000045/* 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:
50extern SizeT MC_(Malloc_Redzone_SzB);
njn1d0825f2006-03-27 11:37:07 +000051
52/* For malloc()/new/new[] vs. free()/delete/delete[] mismatch checking. */
53typedef
54 enum {
55 MC_AllocMalloc = 0,
56 MC_AllocNew = 1,
57 MC_AllocNewVec = 2,
58 MC_AllocCustom = 3
59 }
60 MC_AllocKind;
61
njn8225cc02009-03-09 22:52:24 +000062/* This describes a heap block. Nb: first two fields must match core's
63 * VgHashNode. */
njn1d0825f2006-03-27 11:37:07 +000064typedef
65 struct _MC_Chunk {
66 struct _MC_Chunk* next;
njn8225cc02009-03-09 22:52:24 +000067 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.
philippe8617b5b2013-01-12 19:53:08 +000070 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. */
njn1d0825f2006-03-27 11:37:07 +000073 }
74 MC_Chunk;
75
philippe8617b5b2013-01-12 19:53:08 +000076/* 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). */
79ExeContext* MC_(allocated_at) (MC_Chunk*);
80ExeContext* MC_(freed_at) (MC_Chunk*);
81
82/* Records and sets execontext according to MC_(clo_keep_stacktraces) */
83void MC_(set_allocated_at) (ThreadId, MC_Chunk*);
84void MC_(set_freed_at) (ThreadId, MC_Chunk*);
85
86/* number of pointers needed according to MC_(clo_keep_stacktraces). */
87UInt MC_(n_where_pointers) (void);
88
njn1d0825f2006-03-27 11:37:07 +000089/* Memory pool. Nb: first two fields must match core's VgHashNode. */
90typedef
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
florian09a4c792014-10-18 10:58:05 +000096 VgHashTable *chunks; // chunks associated with this pool
njn1d0825f2006-03-27 11:37:07 +000097 }
98 MC_Mempool;
99
100
sewardj56adc352008-05-02 11:25:17 +0000101void* MC_(new_block) ( ThreadId tid,
njn1dcee092009-02-24 03:07:37 +0000102 Addr p, SizeT size, SizeT align,
sewardj56adc352008-05-02 11:25:17 +0000103 Bool is_zeroed, MC_AllocKind kind,
florian09a4c792014-10-18 10:58:05 +0000104 VgHashTable *table);
sewardj56adc352008-05-02 11:25:17 +0000105void MC_(handle_free) ( ThreadId tid,
106 Addr p, UInt rzB, MC_AllocKind kind );
njn1d0825f2006-03-27 11:37:07 +0000107
sewardj56adc352008-05-02 11:25:17 +0000108void MC_(create_mempool) ( Addr pool, UInt rzB, Bool is_zeroed );
109void MC_(destroy_mempool) ( Addr pool );
110void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
111 Addr addr, SizeT size );
112void MC_(mempool_free) ( Addr pool, Addr addr );
113void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
114void MC_(move_mempool) ( Addr poolA, Addr poolB );
115void MC_(mempool_change) ( Addr pool, Addr addrA, Addr addrB, SizeT size );
116Bool MC_(mempool_exists) ( Addr pool );
njn1d0825f2006-03-27 11:37:07 +0000117
sewardj403d8aa2011-10-22 19:48:57 +0000118/* 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. */
121MC_Chunk* MC_(get_freed_block_bracketting)( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000122
philippe6643e962012-01-17 21:16:30 +0000123/* For efficient pooled alloc/free of the MC_Chunk. */
124extern PoolAlloc* MC_(chunk_poolalloc);
125
njnb965efb2009-08-10 07:36:54 +0000126/* 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. */
florian09a4c792014-10-18 10:58:05 +0000130extern VgHashTable *MC_(malloc_list);
njn1d0825f2006-03-27 11:37:07 +0000131
132/* For tracking memory pools. */
florian09a4c792014-10-18 10:58:05 +0000133extern VgHashTable *MC_(mempool_list);
njn1d0825f2006-03-27 11:37:07 +0000134
135/* Shadow memory functions */
sewardj56adc352008-05-02 11:25:17 +0000136Bool MC_(check_mem_is_noaccess)( Addr a, SizeT len, Addr* bad_addr );
137void MC_(make_mem_noaccess) ( Addr a, SizeT len );
138void MC_(make_mem_undefined_w_otag)( Addr a, SizeT len, UInt otag );
139void MC_(make_mem_defined) ( Addr a, SizeT len );
140void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len );
njn1d0825f2006-03-27 11:37:07 +0000141
sewardj56adc352008-05-02 11:25:17 +0000142void MC_(print_malloc_stats) ( void );
philippea22f59d2012-01-26 23:13:52 +0000143/* nr of free operations done */
144SizeT MC_(get_cmalloc_n_frees) ( void );
njn1d0825f2006-03-27 11:37:07 +0000145
sewardj56adc352008-05-02 11:25:17 +0000146void* MC_(malloc) ( ThreadId tid, SizeT n );
147void* MC_(__builtin_new) ( ThreadId tid, SizeT n );
148void* MC_(__builtin_vec_new) ( ThreadId tid, SizeT n );
149void* MC_(memalign) ( ThreadId tid, SizeT align, SizeT n );
150void* MC_(calloc) ( ThreadId tid, SizeT nmemb, SizeT size1 );
151void MC_(free) ( ThreadId tid, void* p );
152void MC_(__builtin_delete) ( ThreadId tid, void* p );
153void MC_(__builtin_vec_delete) ( ThreadId tid, void* p );
154void* MC_(realloc) ( ThreadId tid, void* p, SizeT new_size );
njn8b140de2009-02-17 04:31:18 +0000155SizeT MC_(malloc_usable_size) ( ThreadId tid, void* p );
sewardj56adc352008-05-02 11:25:17 +0000156
bart91347382011-03-25 20:07:25 +0000157void MC_(handle_resizeInPlace)(ThreadId tid, Addr p,
158 SizeT oldSizeB, SizeT newSizeB, SizeT rzB);
159
njn43c799e2003-04-08 00:08:52 +0000160
sewardj7cf4e6b2008-05-01 20:24:26 +0000161/*------------------------------------------------------------*/
162/*--- Origin tracking translate-time support ---*/
163/*------------------------------------------------------------*/
164
165/* See detailed comments in mc_machine.c. */
sewardj7cf4e6b2008-05-01 20:24:26 +0000166Int MC_(get_otrack_shadow_offset) ( Int offset, Int szB );
sewardj7cf4e6b2008-05-01 20:24:26 +0000167IRType 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
njn43c799e2003-04-08 00:08:52 +0000203
204/*------------------------------------------------------------*/
njn1d0825f2006-03-27 11:37:07 +0000205/*--- Profiling of memory events ---*/
206/*------------------------------------------------------------*/
207
208/* Define to collect detailed performance info. */
209/* #define MC_PROFILE_MEMORY */
njn1d0825f2006-03-27 11:37:07 +0000210#ifdef MC_PROFILE_MEMORY
njn1d0825f2006-03-27 11:37:07 +0000211
florian60042192015-08-04 15:58:41 +0000212/* 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. */
214enum {
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};
njn1d0825f2006-03-27 11:37:07 +0000322
florianed59b702015-08-09 20:55:39 +0000323extern ULong MC_(event_ctr)[MCPE_LAST];
florian60042192015-08-04 15:58:41 +0000324
325# define PROF_EVENT(ev) \
326 do { tl_assert((ev) >= 0 && (ev) < MCPE_LAST); \
327 MC_(event_ctr)[ev]++; \
njn1d0825f2006-03-27 11:37:07 +0000328 } while (False);
329
330#else
331
florian60042192015-08-04 15:58:41 +0000332# define PROF_EVENT(ev) /* */
njn1d0825f2006-03-27 11:37:07 +0000333
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
njn718d3b12006-12-16 00:54:12 +0000367typedef
368 enum {
njn29a5c012009-05-06 06:15:55 +0000369 // 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
njn8225cc02009-03-09 22:52:24 +0000373 // least one interior-pointer along the way.
njn29a5c012009-05-06 06:15:55 +0000374 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.)
njn718d3b12006-12-16 00:54:12 +0000378 }
379 Reachedness;
380
philippe2193a7c2012-12-08 17:54:16 +0000381// 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))
philippeec905f72014-08-17 20:03:51 +0000385// Returns a set containing all Reachedness
386UInt MC_(all_Reachedness)(void);
philippea22f59d2012-01-26 23:13:52 +0000387
njn1d0825f2006-03-27 11:37:07 +0000388/* For VALGRIND_COUNT_LEAKS client request */
sewardj505a8192008-07-18 20:15:46 +0000389extern SizeT MC_(bytes_leaked);
390extern SizeT MC_(bytes_indirect);
391extern SizeT MC_(bytes_dubious);
392extern SizeT MC_(bytes_reachable);
393extern SizeT MC_(bytes_suppressed);
njn1d0825f2006-03-27 11:37:07 +0000394
njn8df80b22009-03-02 05:11:06 +0000395/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
396extern SizeT MC_(blocks_leaked);
397extern SizeT MC_(blocks_indirect);
398extern SizeT MC_(blocks_dubious);
399extern SizeT MC_(blocks_reachable);
400extern SizeT MC_(blocks_suppressed);
401
njn1d0825f2006-03-27 11:37:07 +0000402typedef
403 enum {
404 LC_Off,
405 LC_Summary,
406 LC_Full,
407 }
408 LeakCheckMode;
409
sewardjc8bd1df2011-06-26 12:41:33 +0000410typedef
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
njn29a5c012009-05-06 06:15:55 +0000419/* When a LossRecord is put into an OSet, these elements represent the key. */
420typedef
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
njnb7a4e2e2009-05-01 00:30:43 +0000427/* 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). */
njn718d3b12006-12-16 00:54:12 +0000430typedef
431 struct _LossRecord {
njn29a5c012009-05-06 06:15:55 +0000432 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.
sewardjc8bd1df2011-06-26 12:41:33 +0000436 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
njn718d3b12006-12-16 00:54:12 +0000439 }
440 LossRecord;
441
sewardjc8bd1df2011-06-26 12:41:33 +0000442typedef
443 struct _LeakCheckParams {
444 LeakCheckMode mode;
philippe2193a7c2012-12-08 17:54:16 +0000445 UInt show_leak_kinds;
446 UInt errors_for_leak_kinds;
philippeab1fce92013-09-29 13:47:32 +0000447 UInt heuristics;
sewardjc8bd1df2011-06-26 12:41:33 +0000448 LeakCheckDeltaMode deltamode;
philippeab1fce92013-09-29 13:47:32 +0000449 UInt max_loss_records_output; // limit on the nr of loss records output.
sewardjc8bd1df2011-06-26 12:41:33 +0000450 Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
451 }
452 LeakCheckParams;
453
philippe84234902012-01-14 13:53:13 +0000454void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams * lcp);
sewardjc8bd1df2011-06-26 12:41:33 +0000455
philippe4e32d672013-10-17 22:10:41 +0000456// Each time a leak search is done, the leak search generation
457// MC_(leak_search_gen) is incremented.
458extern UInt MC_(leak_search_gen);
459
sewardjc8bd1df2011-06-26 12:41:33 +0000460// maintains the lcp.deltamode given in the last call to detect_memory_leaks
461extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
462
philippea22f59d2012-01-26 23:13:52 +0000463// prints the list of blocks corresponding to the given loss_record_nr.
philippeab1fce92013-09-29 13:47:32 +0000464// Returns True if loss_record_nr identifies a correct loss record from last
465// leak search, returns False otherwise.
philippea22f59d2012-01-26 23:13:52 +0000466Bool MC_(print_block_list) ( UInt loss_record_nr);
467
468// Prints the addresses/registers/... at which a pointer to
469// the given range [address, address+szB[ is found.
470void MC_(who_points_at) ( Addr address, SizeT szB);
471
sewardj30b3eca2011-06-28 08:20:39 +0000472// if delta_mode == LCD_Any, prints in buf an empty string
sewardjc8bd1df2011-06-26 12:41:33 +0000473// otherwise prints a delta in the layout " (+%'lu)" or " (-%'lu)"
floriandbb35842012-10-27 18:39:11 +0000474extern HChar * MC_(snprintf_delta) (HChar * buf, Int size,
475 SizeT current_val, SizeT old_val,
476 LeakCheckDeltaMode delta_mode);
sewardjc8bd1df2011-06-26 12:41:33 +0000477
njn8225cc02009-03-09 22:52:24 +0000478
479Bool MC_(is_valid_aligned_word) ( Addr a );
480Bool MC_(is_within_valid_secondary) ( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000481
philippea22f59d2012-01-26 23:13:52 +0000482// Prints as user msg a description of the given loss record.
483void MC_(pp_LossRecord)(UInt n_this_record, UInt n_total_records,
484 LossRecord* l);
njn718d3b12006-12-16 00:54:12 +0000485
486
487/*------------------------------------------------------------*/
488/*--- Errors and suppressions ---*/
489/*------------------------------------------------------------*/
490
sewardj7ce71662008-05-02 10:33:15 +0000491/* Did we show to the user, any errors for which an uninitialised
492 value origin could have been collected (but wasn't) ? If yes,
493 then, at the end of the run, print a 1 line message advising that a
494 rerun with --track-origins=yes might help. */
sewardj505a8192008-07-18 20:15:46 +0000495extern Bool MC_(any_value_errors);
sewardj7ce71662008-05-02 10:33:15 +0000496
497/* Standard functions for error and suppressions as required by the
498 core/tool iface */
florian8e3fbb52014-10-20 19:02:38 +0000499Bool MC_(eq_Error) ( VgRes res, const Error* e1, const Error* e2 );
500void MC_(before_pp_Error) ( const Error* err );
501void MC_(pp_Error) ( const Error* err );
502UInt MC_(update_Error_extra) ( const Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000503
florian19f91bb2012-11-10 22:29:54 +0000504Bool MC_(is_recognised_suppression) ( const HChar* name, Supp* su );
sewardj7ce71662008-05-02 10:33:15 +0000505
florian19f91bb2012-11-10 22:29:54 +0000506Bool MC_(read_extra_suppression_info) ( Int fd, HChar** buf,
philippe362441d2013-07-22 22:00:13 +0000507 SizeT* nBuf, Int* lineno, Supp *su );
sewardj7ce71662008-05-02 10:33:15 +0000508
florian8e3fbb52014-10-20 19:02:38 +0000509Bool MC_(error_matches_suppression) ( const Error* err, const Supp* su );
sewardj7ce71662008-05-02 10:33:15 +0000510
florian8e3fbb52014-10-20 19:02:38 +0000511SizeT MC_(get_extra_suppression_info) ( const Error* err,
philippe4e32d672013-10-17 22:10:41 +0000512 /*OUT*/HChar* buf, Int nBuf );
florian8e3fbb52014-10-20 19:02:38 +0000513SizeT MC_(print_extra_suppression_use) ( const Supp* su,
florian3e81b8b2014-10-07 14:28:52 +0000514 /*OUT*/HChar* buf, Int nBuf );
florian8e3fbb52014-10-20 19:02:38 +0000515void MC_(update_extra_suppression_use) ( const Error* err, const Supp* su );
sewardj7ce71662008-05-02 10:33:15 +0000516
florian8e3fbb52014-10-20 19:02:38 +0000517const HChar* MC_(get_error_name) ( const Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000518
519/* Recording of errors */
520void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
521 Bool isWrite );
522void MC_(record_cond_error) ( ThreadId tid, UInt otag );
523void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
524void MC_(record_jump_error) ( ThreadId tid, Addr a );
525
526void MC_(record_free_error) ( ThreadId tid, Addr a );
527void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
528void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
529
floriane543f302012-10-21 19:43:43 +0000530void MC_(record_overlap_error) ( ThreadId tid, const HChar* function,
sewardj7ce71662008-05-02 10:33:15 +0000531 Addr src, Addr dst, SizeT szB );
floriane543f302012-10-21 19:43:43 +0000532void MC_(record_core_mem_error) ( ThreadId tid, const HChar* msg );
533void MC_(record_regparam_error) ( ThreadId tid, const HChar* msg, UInt otag );
sewardj7ce71662008-05-02 10:33:15 +0000534void MC_(record_memparam_error) ( ThreadId tid, Addr a,
floriane543f302012-10-21 19:43:43 +0000535 Bool isAddrErr, const HChar* msg, UInt otag );
sewardj7ce71662008-05-02 10:33:15 +0000536void MC_(record_user_error) ( ThreadId tid, Addr a,
537 Bool isAddrErr, UInt otag );
538
539Bool MC_(record_leak_error) ( ThreadId tid,
540 UInt n_this_record,
541 UInt n_total_records,
542 LossRecord* lossRecord,
njn18afe5d2009-08-10 08:25:39 +0000543 Bool print_record,
544 Bool count_error );
sewardj7ce71662008-05-02 10:33:15 +0000545
florian7b6899d2014-07-13 14:41:55 +0000546Bool MC_(record_fishy_value_error) ( ThreadId tid, const HChar* function,
547 const HChar *argument_name, SizeT value );
548
philippeec905f72014-08-17 20:03:51 +0000549/* Leak kinds tokens to call VG_(parse_enum_set). */
550extern const HChar* MC_(parse_leak_kinds_tokens);
philippe2193a7c2012-12-08 17:54:16 +0000551
sewardj3b290482011-05-06 21:02:55 +0000552/* prints a description of address a */
553void MC_(pp_describe_addr) (Addr a);
554
sewardj7ce71662008-05-02 10:33:15 +0000555/* Is this address in a user-specified "ignored range" ? */
556Bool MC_(in_ignored_range) ( Addr a );
557
558
559/*------------------------------------------------------------*/
560/*--- Client blocks ---*/
561/*------------------------------------------------------------*/
562
563/* Describes a client block. See mc_main.c. An unused block has
564 start == size == 0. */
565typedef
566 struct {
567 Addr start;
568 SizeT size;
569 ExeContext* where;
floriana5f894c2012-10-21 03:43:20 +0000570 HChar* desc;
sewardj7ce71662008-05-02 10:33:15 +0000571 }
572 CGenBlock;
573
574/* Get access to the client block array. */
575void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
576 /*OUT*/UWord* nBlocks );
577
njn718d3b12006-12-16 00:54:12 +0000578
njn1d0825f2006-03-27 11:37:07 +0000579/*------------------------------------------------------------*/
580/*--- Command line options + defaults ---*/
581/*------------------------------------------------------------*/
582
583/* Allow loads from partially-valid addresses? default: YES */
sewardj505a8192008-07-18 20:15:46 +0000584extern Bool MC_(clo_partial_loads_ok);
njn1d0825f2006-03-27 11:37:07 +0000585
586/* Max volume of the freed blocks queue. */
sewardj505a8192008-07-18 20:15:46 +0000587extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000588
sewardj403d8aa2011-10-22 19:48:57 +0000589/* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put
590 in the "big block" freed blocks queue. */
591extern Long MC_(clo_freelist_big_blocks);
592
njn1d0825f2006-03-27 11:37:07 +0000593/* Do leak check at exit? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000594extern LeakCheckMode MC_(clo_leak_check);
njn1d0825f2006-03-27 11:37:07 +0000595
596/* How closely should we compare ExeContexts in leak records? default: 2 */
sewardj505a8192008-07-18 20:15:46 +0000597extern VgRes MC_(clo_leak_resolution);
njn1d0825f2006-03-27 11:37:07 +0000598
philippe2193a7c2012-12-08 17:54:16 +0000599/* In leak check, show loss records if their R2S(reachedness) is set.
600 Default : R2S(Possible) | R2S(Unreached). */
601extern UInt MC_(clo_show_leak_kinds);
njn1d0825f2006-03-27 11:37:07 +0000602
philippe2193a7c2012-12-08 17:54:16 +0000603/* In leak check, a loss record is an error if its R2S(reachedness) is set.
604 Default : R2S(Possible) | R2S(Unreached). */
605extern UInt MC_(clo_errors_for_leak_kinds);
bart3cedf572010-08-26 10:56:27 +0000606
philippeab1fce92013-09-29 13:47:32 +0000607/* Various leak check heuristics which can be activated/deactivated. */
608typedef
609 enum {
610 LchNone =0,
611 // no heuristic.
612 LchStdString =1,
613 // Consider interior pointer pointing at the array of char in a
614 // std::string as reachable.
philippe7c69a3e2014-07-21 19:55:11 +0000615 LchLength64 =2,
616 // Consider interior pointer pointing at offset 64bit of a block as
617 // reachable, when the first 8 bytes contains the block size - 8.
618 // Such length+interior pointers are used by e.g. sqlite3MemMalloc.
619 // On 64bit platforms LchNewArray will also match these blocks.
620 LchNewArray =3,
philippeab1fce92013-09-29 13:47:32 +0000621 // Consider interior pointer pointing at second word of a new[] array as
622 // reachable. Such interior pointers are used for arrays whose elements
623 // have a destructor.
philippe7c69a3e2014-07-21 19:55:11 +0000624 LchMultipleInheritance =4,
philippeab1fce92013-09-29 13:47:32 +0000625 // Conside interior pointer pointing just after what looks a vtable
626 // as reachable.
627 }
628 LeakCheckHeuristic;
629
philippe5bd40602013-10-02 20:59:05 +0000630// Nr of heuristics, including the LchNone heuristic.
philippe7c69a3e2014-07-21 19:55:11 +0000631#define N_LEAK_CHECK_HEURISTICS 5
philippeab1fce92013-09-29 13:47:32 +0000632
633// Build mask to check or set Heuristic h membership
634#define H2S(h) (1 << (h))
philippeec905f72014-08-17 20:03:51 +0000635// Heuristic h is member of the Set s ?
636#define HiS(h,s) ((s) & H2S(h))
philippeab1fce92013-09-29 13:47:32 +0000637
638/* Heuristics set to use for the leak search.
639 Default : no heuristic. */
640extern UInt MC_(clo_leak_check_heuristics);
641
njn1d0825f2006-03-27 11:37:07 +0000642/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
643 * default: NO */
sewardj505a8192008-07-18 20:15:46 +0000644extern Bool MC_(clo_workaround_gcc296_bugs);
njn1d0825f2006-03-27 11:37:07 +0000645
sewardjeb0fa932007-11-30 21:41:40 +0000646/* Fill malloc-d/free-d client blocks with a specific value? -1 if
647 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
648 useful for causing programs with bad heap corruption to fail in
649 more repeatable ways. Note that malloc-filled and free-filled
650 areas are still undefined and noaccess respectively. This merely
651 causes them to contain the specified values. */
sewardj505a8192008-07-18 20:15:46 +0000652extern Int MC_(clo_malloc_fill);
653extern Int MC_(clo_free_fill);
sewardjeb0fa932007-11-30 21:41:40 +0000654
philippe8617b5b2013-01-12 19:53:08 +0000655/* Which stack trace(s) to keep for malloc'd/free'd client blocks?
656 For each client block, the stack traces where it was allocated
657 and/or freed are optionally kept depending on MC_(clo_keep_stacktraces). */
658typedef
659 enum { // keep alloc stack trace ? keep free stack trace ?
660 KS_none, // never never
661 KS_alloc, // always never
662 KS_free, // never always
663 KS_alloc_then_free, // when still malloc'd when free'd
664 KS_alloc_and_free, // always always
665 }
666 KeepStacktraces;
667extern KeepStacktraces MC_(clo_keep_stacktraces);
668
sewardj7cf4e6b2008-05-01 20:24:26 +0000669/* Indicates the level of instrumentation/checking done by Memcheck.
670
671 1 = No undefined value checking, Addrcheck-style behaviour only:
672 only address checking is done. This is faster but finds fewer
673 errors. Note that although Addrcheck had 1 bit per byte
674 overhead vs the old Memcheck's 9 bits per byte, with this mode
675 and compressed V bits, no memory is saved with this mode --
676 it's still 2 bits per byte overhead. This is a little wasteful
677 -- it could be done with 1 bit per byte -- but lets us reuse
678 the many shadow memory access functions. Note that in this
679 mode neither the secondary V bit table nor the origin-tag cache
680 are used.
681
682 2 = Address checking and Undefined value checking are performed,
683 but origins are not tracked. So the origin-tag cache is not
684 used in this mode. This setting is the default and corresponds
685 to the "normal" Memcheck behaviour that has shipped for years.
686
687 3 = Address checking, undefined value checking, and origins for
688 undefined values are tracked.
689
690 The default is 2.
691*/
sewardj505a8192008-07-18 20:15:46 +0000692extern Int MC_(clo_mc_level);
sewardj7cf4e6b2008-05-01 20:24:26 +0000693
sewardj021e6b62014-08-22 19:26:23 +0000694/* Should we show mismatched frees? Default: YES */
695extern Bool MC_(clo_show_mismatched_frees);
696
njn1d0825f2006-03-27 11:37:07 +0000697
698/*------------------------------------------------------------*/
699/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000700/*------------------------------------------------------------*/
701
njn66fe05a2003-07-22 09:12:33 +0000702/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000703
sewardj7cf4e6b2008-05-01 20:24:26 +0000704/* For the fail_w_o functions, the UWord arg is actually the 32-bit
705 origin tag and should really be UInt, but to be simple and safe
706 considering it's called from generated code, just claim it to be a
707 UWord. */
sewardj56adc352008-05-02 11:25:17 +0000708VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
709VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
710VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
711VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
712VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
sewardj7cf4e6b2008-05-01 20:24:26 +0000713
714/* And call these ones instead to report an uninitialised value error
715 but with no origin available. */
sewardj56adc352008-05-02 11:25:17 +0000716VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
717VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
718VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
719VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
720VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
sewardj7cf4e6b2008-05-01 20:24:26 +0000721
722/* V-bits load/store helpers */
sewardj56adc352008-05-02 11:25:17 +0000723VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
724VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
725VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
726VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
727VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
728VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
sewardj21a5f8c2013-08-08 10:41:46 +0000729VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000730
sewardj67564542013-08-16 08:31:29 +0000731VG_REGPARM(2) void MC_(helperc_LOADV256be) ( /*OUT*/V256*, Addr );
732VG_REGPARM(2) void MC_(helperc_LOADV256le) ( /*OUT*/V256*, Addr );
sewardj21a5f8c2013-08-08 10:41:46 +0000733VG_REGPARM(2) void MC_(helperc_LOADV128be) ( /*OUT*/V128*, Addr );
734VG_REGPARM(2) void MC_(helperc_LOADV128le) ( /*OUT*/V128*, Addr );
735VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
736VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
737VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
738VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
739VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
740VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
741VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000742
sewardj56adc352008-05-02 11:25:17 +0000743void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
744 Addr nia );
sewardj7cf4e6b2008-05-01 20:24:26 +0000745
746/* Origin tag load/store helpers */
747VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
748VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
749VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
750VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
751VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
sewardj45fa9f42012-05-21 10:18:10 +0000752VG_REGPARM(2) void MC_(helperc_b_store32)( Addr a, UWord d32 );
sewardj7cf4e6b2008-05-01 20:24:26 +0000753VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
754VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
755VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
756VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
757VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj45fa9f42012-05-21 10:18:10 +0000758VG_REGPARM(1) UWord MC_(helperc_b_load32)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000759
njn51d827b2005-05-09 01:02:08 +0000760/* Functions defined in mc_translate.c */
sewardj0b9d74a2006-12-24 02:24:11 +0000761IRSB* MC_(instrument) ( VgCallbackClosure* closure,
762 IRSB* bb_in,
florian3c0c9472014-09-24 12:06:55 +0000763 const VexGuestLayout* layout,
764 const VexGuestExtents* vge,
765 const VexArchInfo* archinfo_host,
sewardj4ba057c2005-10-18 12:04:18 +0000766 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000767
sewardj81651dc2007-08-28 06:05:20 +0000768IRSB* MC_(final_tidy) ( IRSB* );
769
sewardj8d61eb12005-07-08 09:46:53 +0000770#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000771
772/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000773/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000774/*--------------------------------------------------------------------*/