blob: 26ad25e1fdf6fe2e1c26939e976e407f24040ed0 [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
96 VgHashTable chunks; // chunks associated with this pool
97 }
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,
104 VgHashTable table);
105void 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. */
sewardj505a8192008-07-18 20:15:46 +0000130extern VgHashTable MC_(malloc_list);
njn1d0825f2006-03-27 11:37:07 +0000131
132/* For tracking memory pools. */
sewardj505a8192008-07-18 20:15:46 +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 */
210
211#ifdef MC_PROFILE_MEMORY
212# define N_PROF_EVENTS 500
213
sewardj56adc352008-05-02 11:25:17 +0000214UInt MC_(event_ctr)[N_PROF_EVENTS];
215HChar* MC_(event_ctr_name)[N_PROF_EVENTS];
njn1d0825f2006-03-27 11:37:07 +0000216
217# define PROF_EVENT(ev, name) \
218 do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS); \
219 /* crude and inaccurate check to ensure the same */ \
220 /* event isn't being used with > 1 name */ \
221 if (MC_(event_ctr_name)[ev]) \
222 tl_assert(name == MC_(event_ctr_name)[ev]); \
223 MC_(event_ctr)[ev]++; \
224 MC_(event_ctr_name)[ev] = (name); \
225 } while (False);
226
227#else
228
229# define PROF_EVENT(ev, name) /* */
230
231#endif /* MC_PROFILE_MEMORY */
232
233
234/*------------------------------------------------------------*/
235/*--- V and A bits (Victoria & Albert ?) ---*/
236/*------------------------------------------------------------*/
237
238/* The number of entries in the primary map can be altered. However
239 we hardwire the assumption that each secondary map covers precisely
240 64k of address space. */
241#define SM_SIZE 65536 /* DO NOT CHANGE */
242#define SM_MASK (SM_SIZE-1) /* DO NOT CHANGE */
243
244#define V_BIT_DEFINED 0
245#define V_BIT_UNDEFINED 1
246
247#define V_BITS8_DEFINED 0
248#define V_BITS8_UNDEFINED 0xFF
249
250#define V_BITS16_DEFINED 0
251#define V_BITS16_UNDEFINED 0xFFFF
252
253#define V_BITS32_DEFINED 0
254#define V_BITS32_UNDEFINED 0xFFFFFFFF
255
256#define V_BITS64_DEFINED 0ULL
257#define V_BITS64_UNDEFINED 0xFFFFFFFFFFFFFFFFULL
258
259
260/*------------------------------------------------------------*/
261/*--- Leak checking ---*/
262/*------------------------------------------------------------*/
263
njn718d3b12006-12-16 00:54:12 +0000264typedef
265 enum {
njn29a5c012009-05-06 06:15:55 +0000266 // Nb: the order is important -- it dictates the order of loss records
267 // of equal sizes.
268 Reachable =0, // Definitely reachable from root-set.
269 Possible =1, // Possibly reachable from root-set; involves at
njn8225cc02009-03-09 22:52:24 +0000270 // least one interior-pointer along the way.
njn29a5c012009-05-06 06:15:55 +0000271 IndirectLeak =2, // Leaked, but reachable from another leaked block
272 // (be it Unreached or IndirectLeak).
273 Unreached =3, // Not reached, ie. leaked.
274 // (At best, only reachable from itself via a cycle.)
njn718d3b12006-12-16 00:54:12 +0000275 }
276 Reachedness;
277
philippe2193a7c2012-12-08 17:54:16 +0000278// Build mask to check or set Reachedness r membership
279#define R2S(r) (1 << (r))
280// Reachedness r is member of the Set s ?
281#define RiS(r,s) ((s) & R2S(r))
philippeec905f72014-08-17 20:03:51 +0000282// Returns a set containing all Reachedness
283UInt MC_(all_Reachedness)(void);
philippea22f59d2012-01-26 23:13:52 +0000284
njn1d0825f2006-03-27 11:37:07 +0000285/* For VALGRIND_COUNT_LEAKS client request */
sewardj505a8192008-07-18 20:15:46 +0000286extern SizeT MC_(bytes_leaked);
287extern SizeT MC_(bytes_indirect);
288extern SizeT MC_(bytes_dubious);
289extern SizeT MC_(bytes_reachable);
290extern SizeT MC_(bytes_suppressed);
njn1d0825f2006-03-27 11:37:07 +0000291
njn8df80b22009-03-02 05:11:06 +0000292/* For VALGRIND_COUNT_LEAK_BLOCKS client request */
293extern SizeT MC_(blocks_leaked);
294extern SizeT MC_(blocks_indirect);
295extern SizeT MC_(blocks_dubious);
296extern SizeT MC_(blocks_reachable);
297extern SizeT MC_(blocks_suppressed);
298
njn1d0825f2006-03-27 11:37:07 +0000299typedef
300 enum {
301 LC_Off,
302 LC_Summary,
303 LC_Full,
304 }
305 LeakCheckMode;
306
sewardjc8bd1df2011-06-26 12:41:33 +0000307typedef
308 enum {
309 LCD_Any, // output all loss records, whatever the delta
310 LCD_Increased, // output loss records with an increase in size or blocks
311 LCD_Changed, // output loss records with an increase or
312 //decrease in size or blocks
313 }
314 LeakCheckDeltaMode;
315
njn29a5c012009-05-06 06:15:55 +0000316/* When a LossRecord is put into an OSet, these elements represent the key. */
317typedef
318 struct _LossRecordKey {
319 Reachedness state; // LC_Extra.state value shared by all blocks.
320 ExeContext* allocated_at; // Where they were allocated.
321 }
322 LossRecordKey;
323
njnb7a4e2e2009-05-01 00:30:43 +0000324/* A loss record, used for generating err msgs. Multiple leaked blocks can be
325 * merged into a single loss record if they have the same state and similar
326 * enough allocation points (controlled by --leak-resolution). */
njn718d3b12006-12-16 00:54:12 +0000327typedef
328 struct _LossRecord {
njn29a5c012009-05-06 06:15:55 +0000329 LossRecordKey key; // Key, when used in an OSet.
330 SizeT szB; // Sum of all MC_Chunk.szB values.
331 SizeT indirect_szB; // Sum of all LC_Extra.indirect_szB values.
332 UInt num_blocks; // Number of blocks represented by the record.
sewardjc8bd1df2011-06-26 12:41:33 +0000333 SizeT old_szB; // old_* values are the values found during the
334 SizeT old_indirect_szB; // previous leak search. old_* values are used to
335 UInt old_num_blocks; // output only the changed/new loss records
njn718d3b12006-12-16 00:54:12 +0000336 }
337 LossRecord;
338
sewardjc8bd1df2011-06-26 12:41:33 +0000339typedef
340 struct _LeakCheckParams {
341 LeakCheckMode mode;
philippe2193a7c2012-12-08 17:54:16 +0000342 UInt show_leak_kinds;
343 UInt errors_for_leak_kinds;
philippeab1fce92013-09-29 13:47:32 +0000344 UInt heuristics;
sewardjc8bd1df2011-06-26 12:41:33 +0000345 LeakCheckDeltaMode deltamode;
philippeab1fce92013-09-29 13:47:32 +0000346 UInt max_loss_records_output; // limit on the nr of loss records output.
sewardjc8bd1df2011-06-26 12:41:33 +0000347 Bool requested_by_monitor_command; // True when requested by gdb/vgdb.
348 }
349 LeakCheckParams;
350
philippe84234902012-01-14 13:53:13 +0000351void MC_(detect_memory_leaks) ( ThreadId tid, LeakCheckParams * lcp);
sewardjc8bd1df2011-06-26 12:41:33 +0000352
philippe4e32d672013-10-17 22:10:41 +0000353// Each time a leak search is done, the leak search generation
354// MC_(leak_search_gen) is incremented.
355extern UInt MC_(leak_search_gen);
356
sewardjc8bd1df2011-06-26 12:41:33 +0000357// maintains the lcp.deltamode given in the last call to detect_memory_leaks
358extern LeakCheckDeltaMode MC_(detect_memory_leaks_last_delta_mode);
359
philippea22f59d2012-01-26 23:13:52 +0000360// prints the list of blocks corresponding to the given loss_record_nr.
philippeab1fce92013-09-29 13:47:32 +0000361// Returns True if loss_record_nr identifies a correct loss record from last
362// leak search, returns False otherwise.
philippea22f59d2012-01-26 23:13:52 +0000363Bool MC_(print_block_list) ( UInt loss_record_nr);
364
365// Prints the addresses/registers/... at which a pointer to
366// the given range [address, address+szB[ is found.
367void MC_(who_points_at) ( Addr address, SizeT szB);
368
sewardj30b3eca2011-06-28 08:20:39 +0000369// if delta_mode == LCD_Any, prints in buf an empty string
sewardjc8bd1df2011-06-26 12:41:33 +0000370// otherwise prints a delta in the layout " (+%'lu)" or " (-%'lu)"
floriandbb35842012-10-27 18:39:11 +0000371extern HChar * MC_(snprintf_delta) (HChar * buf, Int size,
372 SizeT current_val, SizeT old_val,
373 LeakCheckDeltaMode delta_mode);
sewardjc8bd1df2011-06-26 12:41:33 +0000374
njn8225cc02009-03-09 22:52:24 +0000375
376Bool MC_(is_valid_aligned_word) ( Addr a );
377Bool MC_(is_within_valid_secondary) ( Addr a );
njn1d0825f2006-03-27 11:37:07 +0000378
philippea22f59d2012-01-26 23:13:52 +0000379// Prints as user msg a description of the given loss record.
380void MC_(pp_LossRecord)(UInt n_this_record, UInt n_total_records,
381 LossRecord* l);
njn718d3b12006-12-16 00:54:12 +0000382
383
384/*------------------------------------------------------------*/
385/*--- Errors and suppressions ---*/
386/*------------------------------------------------------------*/
387
sewardj7ce71662008-05-02 10:33:15 +0000388/* Did we show to the user, any errors for which an uninitialised
389 value origin could have been collected (but wasn't) ? If yes,
390 then, at the end of the run, print a 1 line message advising that a
391 rerun with --track-origins=yes might help. */
sewardj505a8192008-07-18 20:15:46 +0000392extern Bool MC_(any_value_errors);
sewardj7ce71662008-05-02 10:33:15 +0000393
394/* Standard functions for error and suppressions as required by the
395 core/tool iface */
sewardj6b523cd2009-07-15 14:49:40 +0000396Bool MC_(eq_Error) ( VgRes res, Error* e1, Error* e2 );
397void MC_(before_pp_Error) ( Error* err );
398void MC_(pp_Error) ( Error* err );
399UInt MC_(update_Error_extra) ( Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000400
florian19f91bb2012-11-10 22:29:54 +0000401Bool MC_(is_recognised_suppression) ( const HChar* name, Supp* su );
sewardj7ce71662008-05-02 10:33:15 +0000402
florian19f91bb2012-11-10 22:29:54 +0000403Bool MC_(read_extra_suppression_info) ( Int fd, HChar** buf,
philippe362441d2013-07-22 22:00:13 +0000404 SizeT* nBuf, Int* lineno, Supp *su );
sewardj7ce71662008-05-02 10:33:15 +0000405
406Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
407
florian3e81b8b2014-10-07 14:28:52 +0000408SizeT MC_(get_extra_suppression_info) ( Error* err,
philippe4e32d672013-10-17 22:10:41 +0000409 /*OUT*/HChar* buf, Int nBuf );
florian3e81b8b2014-10-07 14:28:52 +0000410SizeT MC_(print_extra_suppression_use) ( Supp* su,
411 /*OUT*/HChar* buf, Int nBuf );
philippe4e32d672013-10-17 22:10:41 +0000412void MC_(update_extra_suppression_use) ( Error* err, Supp* su );
sewardj7ce71662008-05-02 10:33:15 +0000413
floriane543f302012-10-21 19:43:43 +0000414const HChar* MC_(get_error_name) ( Error* err );
sewardj7ce71662008-05-02 10:33:15 +0000415
416/* Recording of errors */
417void MC_(record_address_error) ( ThreadId tid, Addr a, Int szB,
418 Bool isWrite );
419void MC_(record_cond_error) ( ThreadId tid, UInt otag );
420void MC_(record_value_error) ( ThreadId tid, Int szB, UInt otag );
421void MC_(record_jump_error) ( ThreadId tid, Addr a );
422
423void MC_(record_free_error) ( ThreadId tid, Addr a );
424void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
425void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc );
426
floriane543f302012-10-21 19:43:43 +0000427void MC_(record_overlap_error) ( ThreadId tid, const HChar* function,
sewardj7ce71662008-05-02 10:33:15 +0000428 Addr src, Addr dst, SizeT szB );
floriane543f302012-10-21 19:43:43 +0000429void MC_(record_core_mem_error) ( ThreadId tid, const HChar* msg );
430void MC_(record_regparam_error) ( ThreadId tid, const HChar* msg, UInt otag );
sewardj7ce71662008-05-02 10:33:15 +0000431void MC_(record_memparam_error) ( ThreadId tid, Addr a,
floriane543f302012-10-21 19:43:43 +0000432 Bool isAddrErr, const HChar* msg, UInt otag );
sewardj7ce71662008-05-02 10:33:15 +0000433void MC_(record_user_error) ( ThreadId tid, Addr a,
434 Bool isAddrErr, UInt otag );
435
436Bool MC_(record_leak_error) ( ThreadId tid,
437 UInt n_this_record,
438 UInt n_total_records,
439 LossRecord* lossRecord,
njn18afe5d2009-08-10 08:25:39 +0000440 Bool print_record,
441 Bool count_error );
sewardj7ce71662008-05-02 10:33:15 +0000442
florian7b6899d2014-07-13 14:41:55 +0000443Bool MC_(record_fishy_value_error) ( ThreadId tid, const HChar* function,
444 const HChar *argument_name, SizeT value );
445
philippeec905f72014-08-17 20:03:51 +0000446/* Leak kinds tokens to call VG_(parse_enum_set). */
447extern const HChar* MC_(parse_leak_kinds_tokens);
philippe2193a7c2012-12-08 17:54:16 +0000448
sewardj3b290482011-05-06 21:02:55 +0000449/* prints a description of address a */
450void MC_(pp_describe_addr) (Addr a);
451
sewardj7ce71662008-05-02 10:33:15 +0000452/* Is this address in a user-specified "ignored range" ? */
453Bool MC_(in_ignored_range) ( Addr a );
454
455
456/*------------------------------------------------------------*/
457/*--- Client blocks ---*/
458/*------------------------------------------------------------*/
459
460/* Describes a client block. See mc_main.c. An unused block has
461 start == size == 0. */
462typedef
463 struct {
464 Addr start;
465 SizeT size;
466 ExeContext* where;
floriana5f894c2012-10-21 03:43:20 +0000467 HChar* desc;
sewardj7ce71662008-05-02 10:33:15 +0000468 }
469 CGenBlock;
470
471/* Get access to the client block array. */
472void MC_(get_ClientBlock_array)( /*OUT*/CGenBlock** blocks,
473 /*OUT*/UWord* nBlocks );
474
njn718d3b12006-12-16 00:54:12 +0000475
njn1d0825f2006-03-27 11:37:07 +0000476/*------------------------------------------------------------*/
477/*--- Command line options + defaults ---*/
478/*------------------------------------------------------------*/
479
480/* Allow loads from partially-valid addresses? default: YES */
sewardj505a8192008-07-18 20:15:46 +0000481extern Bool MC_(clo_partial_loads_ok);
njn1d0825f2006-03-27 11:37:07 +0000482
483/* Max volume of the freed blocks queue. */
sewardj505a8192008-07-18 20:15:46 +0000484extern Long MC_(clo_freelist_vol);
njn1d0825f2006-03-27 11:37:07 +0000485
sewardj403d8aa2011-10-22 19:48:57 +0000486/* Blocks with a size >= MC_(clo_freelist_big_blocks) will be put
487 in the "big block" freed blocks queue. */
488extern Long MC_(clo_freelist_big_blocks);
489
njn1d0825f2006-03-27 11:37:07 +0000490/* Do leak check at exit? default: NO */
sewardj505a8192008-07-18 20:15:46 +0000491extern LeakCheckMode MC_(clo_leak_check);
njn1d0825f2006-03-27 11:37:07 +0000492
493/* How closely should we compare ExeContexts in leak records? default: 2 */
sewardj505a8192008-07-18 20:15:46 +0000494extern VgRes MC_(clo_leak_resolution);
njn1d0825f2006-03-27 11:37:07 +0000495
philippe2193a7c2012-12-08 17:54:16 +0000496/* In leak check, show loss records if their R2S(reachedness) is set.
497 Default : R2S(Possible) | R2S(Unreached). */
498extern UInt MC_(clo_show_leak_kinds);
njn1d0825f2006-03-27 11:37:07 +0000499
philippe2193a7c2012-12-08 17:54:16 +0000500/* In leak check, a loss record is an error if its R2S(reachedness) is set.
501 Default : R2S(Possible) | R2S(Unreached). */
502extern UInt MC_(clo_errors_for_leak_kinds);
bart3cedf572010-08-26 10:56:27 +0000503
philippeab1fce92013-09-29 13:47:32 +0000504/* Various leak check heuristics which can be activated/deactivated. */
505typedef
506 enum {
507 LchNone =0,
508 // no heuristic.
509 LchStdString =1,
510 // Consider interior pointer pointing at the array of char in a
511 // std::string as reachable.
philippe7c69a3e2014-07-21 19:55:11 +0000512 LchLength64 =2,
513 // Consider interior pointer pointing at offset 64bit of a block as
514 // reachable, when the first 8 bytes contains the block size - 8.
515 // Such length+interior pointers are used by e.g. sqlite3MemMalloc.
516 // On 64bit platforms LchNewArray will also match these blocks.
517 LchNewArray =3,
philippeab1fce92013-09-29 13:47:32 +0000518 // Consider interior pointer pointing at second word of a new[] array as
519 // reachable. Such interior pointers are used for arrays whose elements
520 // have a destructor.
philippe7c69a3e2014-07-21 19:55:11 +0000521 LchMultipleInheritance =4,
philippeab1fce92013-09-29 13:47:32 +0000522 // Conside interior pointer pointing just after what looks a vtable
523 // as reachable.
524 }
525 LeakCheckHeuristic;
526
philippe5bd40602013-10-02 20:59:05 +0000527// Nr of heuristics, including the LchNone heuristic.
philippe7c69a3e2014-07-21 19:55:11 +0000528#define N_LEAK_CHECK_HEURISTICS 5
philippeab1fce92013-09-29 13:47:32 +0000529
530// Build mask to check or set Heuristic h membership
531#define H2S(h) (1 << (h))
philippeec905f72014-08-17 20:03:51 +0000532// Heuristic h is member of the Set s ?
533#define HiS(h,s) ((s) & H2S(h))
philippeab1fce92013-09-29 13:47:32 +0000534
535/* Heuristics set to use for the leak search.
536 Default : no heuristic. */
537extern UInt MC_(clo_leak_check_heuristics);
538
njn1d0825f2006-03-27 11:37:07 +0000539/* Assume accesses immediately below %esp are due to gcc-2.96 bugs.
540 * default: NO */
sewardj505a8192008-07-18 20:15:46 +0000541extern Bool MC_(clo_workaround_gcc296_bugs);
njn1d0825f2006-03-27 11:37:07 +0000542
sewardjeb0fa932007-11-30 21:41:40 +0000543/* Fill malloc-d/free-d client blocks with a specific value? -1 if
544 not, else 0x00 .. 0xFF indicating the fill value to use. Can be
545 useful for causing programs with bad heap corruption to fail in
546 more repeatable ways. Note that malloc-filled and free-filled
547 areas are still undefined and noaccess respectively. This merely
548 causes them to contain the specified values. */
sewardj505a8192008-07-18 20:15:46 +0000549extern Int MC_(clo_malloc_fill);
550extern Int MC_(clo_free_fill);
sewardjeb0fa932007-11-30 21:41:40 +0000551
philippe8617b5b2013-01-12 19:53:08 +0000552/* Which stack trace(s) to keep for malloc'd/free'd client blocks?
553 For each client block, the stack traces where it was allocated
554 and/or freed are optionally kept depending on MC_(clo_keep_stacktraces). */
555typedef
556 enum { // keep alloc stack trace ? keep free stack trace ?
557 KS_none, // never never
558 KS_alloc, // always never
559 KS_free, // never always
560 KS_alloc_then_free, // when still malloc'd when free'd
561 KS_alloc_and_free, // always always
562 }
563 KeepStacktraces;
564extern KeepStacktraces MC_(clo_keep_stacktraces);
565
sewardj7cf4e6b2008-05-01 20:24:26 +0000566/* Indicates the level of instrumentation/checking done by Memcheck.
567
568 1 = No undefined value checking, Addrcheck-style behaviour only:
569 only address checking is done. This is faster but finds fewer
570 errors. Note that although Addrcheck had 1 bit per byte
571 overhead vs the old Memcheck's 9 bits per byte, with this mode
572 and compressed V bits, no memory is saved with this mode --
573 it's still 2 bits per byte overhead. This is a little wasteful
574 -- it could be done with 1 bit per byte -- but lets us reuse
575 the many shadow memory access functions. Note that in this
576 mode neither the secondary V bit table nor the origin-tag cache
577 are used.
578
579 2 = Address checking and Undefined value checking are performed,
580 but origins are not tracked. So the origin-tag cache is not
581 used in this mode. This setting is the default and corresponds
582 to the "normal" Memcheck behaviour that has shipped for years.
583
584 3 = Address checking, undefined value checking, and origins for
585 undefined values are tracked.
586
587 The default is 2.
588*/
sewardj505a8192008-07-18 20:15:46 +0000589extern Int MC_(clo_mc_level);
sewardj7cf4e6b2008-05-01 20:24:26 +0000590
sewardj021e6b62014-08-22 19:26:23 +0000591/* Should we show mismatched frees? Default: YES */
592extern Bool MC_(clo_show_mismatched_frees);
593
njn1d0825f2006-03-27 11:37:07 +0000594
595/*------------------------------------------------------------*/
596/*--- Instrumentation ---*/
njn25e49d8e72002-09-23 09:36:25 +0000597/*------------------------------------------------------------*/
598
njn66fe05a2003-07-22 09:12:33 +0000599/* Functions defined in mc_main.c */
sewardj95448072004-11-22 20:19:51 +0000600
sewardj7cf4e6b2008-05-01 20:24:26 +0000601/* For the fail_w_o functions, the UWord arg is actually the 32-bit
602 origin tag and should really be UInt, but to be simple and safe
603 considering it's called from generated code, just claim it to be a
604 UWord. */
sewardj56adc352008-05-02 11:25:17 +0000605VG_REGPARM(2) void MC_(helperc_value_checkN_fail_w_o) ( HWord, UWord );
606VG_REGPARM(1) void MC_(helperc_value_check8_fail_w_o) ( UWord );
607VG_REGPARM(1) void MC_(helperc_value_check4_fail_w_o) ( UWord );
608VG_REGPARM(1) void MC_(helperc_value_check1_fail_w_o) ( UWord );
609VG_REGPARM(1) void MC_(helperc_value_check0_fail_w_o) ( UWord );
sewardj7cf4e6b2008-05-01 20:24:26 +0000610
611/* And call these ones instead to report an uninitialised value error
612 but with no origin available. */
sewardj56adc352008-05-02 11:25:17 +0000613VG_REGPARM(1) void MC_(helperc_value_checkN_fail_no_o) ( HWord );
614VG_REGPARM(0) void MC_(helperc_value_check8_fail_no_o) ( void );
615VG_REGPARM(0) void MC_(helperc_value_check4_fail_no_o) ( void );
616VG_REGPARM(0) void MC_(helperc_value_check1_fail_no_o) ( void );
617VG_REGPARM(0) void MC_(helperc_value_check0_fail_no_o) ( void );
sewardj7cf4e6b2008-05-01 20:24:26 +0000618
619/* V-bits load/store helpers */
sewardj56adc352008-05-02 11:25:17 +0000620VG_REGPARM(1) void MC_(helperc_STOREV64be) ( Addr, ULong );
621VG_REGPARM(1) void MC_(helperc_STOREV64le) ( Addr, ULong );
622VG_REGPARM(2) void MC_(helperc_STOREV32be) ( Addr, UWord );
623VG_REGPARM(2) void MC_(helperc_STOREV32le) ( Addr, UWord );
624VG_REGPARM(2) void MC_(helperc_STOREV16be) ( Addr, UWord );
625VG_REGPARM(2) void MC_(helperc_STOREV16le) ( Addr, UWord );
sewardj21a5f8c2013-08-08 10:41:46 +0000626VG_REGPARM(2) void MC_(helperc_STOREV8) ( Addr, UWord );
sewardj95448072004-11-22 20:19:51 +0000627
sewardj67564542013-08-16 08:31:29 +0000628VG_REGPARM(2) void MC_(helperc_LOADV256be) ( /*OUT*/V256*, Addr );
629VG_REGPARM(2) void MC_(helperc_LOADV256le) ( /*OUT*/V256*, Addr );
sewardj21a5f8c2013-08-08 10:41:46 +0000630VG_REGPARM(2) void MC_(helperc_LOADV128be) ( /*OUT*/V128*, Addr );
631VG_REGPARM(2) void MC_(helperc_LOADV128le) ( /*OUT*/V128*, Addr );
632VG_REGPARM(1) ULong MC_(helperc_LOADV64be) ( Addr );
633VG_REGPARM(1) ULong MC_(helperc_LOADV64le) ( Addr );
634VG_REGPARM(1) UWord MC_(helperc_LOADV32be) ( Addr );
635VG_REGPARM(1) UWord MC_(helperc_LOADV32le) ( Addr );
636VG_REGPARM(1) UWord MC_(helperc_LOADV16be) ( Addr );
637VG_REGPARM(1) UWord MC_(helperc_LOADV16le) ( Addr );
638VG_REGPARM(1) UWord MC_(helperc_LOADV8) ( Addr );
njn25e49d8e72002-09-23 09:36:25 +0000639
sewardj56adc352008-05-02 11:25:17 +0000640void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len,
641 Addr nia );
sewardj7cf4e6b2008-05-01 20:24:26 +0000642
643/* Origin tag load/store helpers */
644VG_REGPARM(2) void MC_(helperc_b_store1) ( Addr a, UWord d32 );
645VG_REGPARM(2) void MC_(helperc_b_store2) ( Addr a, UWord d32 );
646VG_REGPARM(2) void MC_(helperc_b_store4) ( Addr a, UWord d32 );
647VG_REGPARM(2) void MC_(helperc_b_store8) ( Addr a, UWord d32 );
648VG_REGPARM(2) void MC_(helperc_b_store16)( Addr a, UWord d32 );
sewardj45fa9f42012-05-21 10:18:10 +0000649VG_REGPARM(2) void MC_(helperc_b_store32)( Addr a, UWord d32 );
sewardj7cf4e6b2008-05-01 20:24:26 +0000650VG_REGPARM(1) UWord MC_(helperc_b_load1) ( Addr a );
651VG_REGPARM(1) UWord MC_(helperc_b_load2) ( Addr a );
652VG_REGPARM(1) UWord MC_(helperc_b_load4) ( Addr a );
653VG_REGPARM(1) UWord MC_(helperc_b_load8) ( Addr a );
654VG_REGPARM(1) UWord MC_(helperc_b_load16)( Addr a );
sewardj45fa9f42012-05-21 10:18:10 +0000655VG_REGPARM(1) UWord MC_(helperc_b_load32)( Addr a );
sewardj826ec492005-05-12 18:05:00 +0000656
njn51d827b2005-05-09 01:02:08 +0000657/* Functions defined in mc_translate.c */
sewardj0b9d74a2006-12-24 02:24:11 +0000658IRSB* MC_(instrument) ( VgCallbackClosure* closure,
659 IRSB* bb_in,
florian3c0c9472014-09-24 12:06:55 +0000660 const VexGuestLayout* layout,
661 const VexGuestExtents* vge,
662 const VexArchInfo* archinfo_host,
sewardj4ba057c2005-10-18 12:04:18 +0000663 IRType gWordTy, IRType hWordTy );
sewardj8d61eb12005-07-08 09:46:53 +0000664
sewardj81651dc2007-08-28 06:05:20 +0000665IRSB* MC_(final_tidy) ( IRSB* );
666
sewardj8d61eb12005-07-08 09:46:53 +0000667#endif /* ndef __MC_INCLUDE_H */
njn25e49d8e72002-09-23 09:36:25 +0000668
669/*--------------------------------------------------------------------*/
nethercote8b76fe52004-11-08 19:20:09 +0000670/*--- end ---*/
njn25e49d8e72002-09-23 09:36:25 +0000671/*--------------------------------------------------------------------*/