| Index: base/third_party/valgrind/memcheck.h
|
| ===================================================================
|
| --- base/third_party/valgrind/memcheck.h (revision 0)
|
| +++ base/third_party/valgrind/memcheck.h (revision 0)
|
| @@ -0,0 +1,279 @@
|
| +
|
| +/*
|
| + ----------------------------------------------------------------
|
| +
|
| + Notice that the following BSD-style license applies to this one
|
| + file (memcheck.h) only. The rest of Valgrind is licensed under the
|
| + terms of the GNU General Public License, version 2, unless
|
| + otherwise indicated. See the COPYING file in the source
|
| + distribution for details.
|
| +
|
| + ----------------------------------------------------------------
|
| +
|
| + This file is part of MemCheck, a heavyweight Valgrind tool for
|
| + detecting memory errors.
|
| +
|
| + Copyright (C) 2000-2010 Julian Seward. All rights reserved.
|
| +
|
| + Redistribution and use in source and binary forms, with or without
|
| + modification, are permitted provided that the following conditions
|
| + are met:
|
| +
|
| + 1. Redistributions of source code must retain the above copyright
|
| + notice, this list of conditions and the following disclaimer.
|
| +
|
| + 2. The origin of this software must not be misrepresented; you must
|
| + not claim that you wrote the original software. If you use this
|
| + software in a product, an acknowledgment in the product
|
| + documentation would be appreciated but is not required.
|
| +
|
| + 3. Altered source versions must be plainly marked as such, and must
|
| + not be misrepresented as being the original software.
|
| +
|
| + 4. The name of the author may not be used to endorse or promote
|
| + products derived from this software without specific prior written
|
| + permission.
|
| +
|
| + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
| + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
| + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
| + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
| + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
| + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
| + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
| + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| + ----------------------------------------------------------------
|
| +
|
| + Notice that the above BSD-style license applies to this one file
|
| + (memcheck.h) only. The entire rest of Valgrind is licensed under
|
| + the terms of the GNU General Public License, version 2. See the
|
| + COPYING file in the source distribution for details.
|
| +
|
| + ----------------------------------------------------------------
|
| +*/
|
| +
|
| +
|
| +#ifndef __MEMCHECK_H
|
| +#define __MEMCHECK_H
|
| +
|
| +
|
| +/* This file is for inclusion into client (your!) code.
|
| +
|
| + You can use these macros to manipulate and query memory permissions
|
| + inside your own programs.
|
| +
|
| + See comment near the top of valgrind.h on how to use them.
|
| +*/
|
| +
|
| +#include "valgrind.h"
|
| +
|
| +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
|
| + This enum comprises an ABI exported by Valgrind to programs
|
| + which use client requests. DO NOT CHANGE THE ORDER OF THESE
|
| + ENTRIES, NOR DELETE ANY -- add new ones at the end. */
|
| +typedef
|
| + enum {
|
| + VG_USERREQ__MAKE_MEM_NOACCESS = VG_USERREQ_TOOL_BASE('M','C'),
|
| + VG_USERREQ__MAKE_MEM_UNDEFINED,
|
| + VG_USERREQ__MAKE_MEM_DEFINED,
|
| + VG_USERREQ__DISCARD,
|
| + VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE,
|
| + VG_USERREQ__CHECK_MEM_IS_DEFINED,
|
| + VG_USERREQ__DO_LEAK_CHECK,
|
| + VG_USERREQ__COUNT_LEAKS,
|
| +
|
| + VG_USERREQ__GET_VBITS,
|
| + VG_USERREQ__SET_VBITS,
|
| +
|
| + VG_USERREQ__CREATE_BLOCK,
|
| +
|
| + VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE,
|
| +
|
| + /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */
|
| + VG_USERREQ__COUNT_LEAK_BLOCKS,
|
| +
|
| + /* This is just for memcheck's internal use - don't use it */
|
| + _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR
|
| + = VG_USERREQ_TOOL_BASE('M','C') + 256
|
| + } Vg_MemCheckClientRequest;
|
| +
|
| +
|
| +
|
| +/* Client-code macros to manipulate the state of memory. */
|
| +
|
| +/* Mark memory at _qzz_addr as unaddressable for _qzz_len bytes. */
|
| +#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr,_qzz_len) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
|
| + VG_USERREQ__MAKE_MEM_NOACCESS, \
|
| + (_qzz_addr), (_qzz_len), 0, 0, 0)
|
| +
|
| +/* Similarly, mark memory at _qzz_addr as addressable but undefined
|
| + for _qzz_len bytes. */
|
| +#define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr,_qzz_len) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
|
| + VG_USERREQ__MAKE_MEM_UNDEFINED, \
|
| + (_qzz_addr), (_qzz_len), 0, 0, 0)
|
| +
|
| +/* Similarly, mark memory at _qzz_addr as addressable and defined
|
| + for _qzz_len bytes. */
|
| +#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr,_qzz_len) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
|
| + VG_USERREQ__MAKE_MEM_DEFINED, \
|
| + (_qzz_addr), (_qzz_len), 0, 0, 0)
|
| +
|
| +/* Similar to VALGRIND_MAKE_MEM_DEFINED except that addressability is
|
| + not altered: bytes which are addressable are marked as defined,
|
| + but those which are not addressable are left unchanged. */
|
| +#define VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(_qzz_addr,_qzz_len) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
|
| + VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, \
|
| + (_qzz_addr), (_qzz_len), 0, 0, 0)
|
| +
|
| +/* Create a block-description handle. The description is an ascii
|
| + string which is included in any messages pertaining to addresses
|
| + within the specified memory range. Has no other effect on the
|
| + properties of the memory range. */
|
| +#define VALGRIND_CREATE_BLOCK(_qzz_addr,_qzz_len, _qzz_desc) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
|
| + VG_USERREQ__CREATE_BLOCK, \
|
| + (_qzz_addr), (_qzz_len), (_qzz_desc), \
|
| + 0, 0)
|
| +
|
| +/* Discard a block-description-handle. Returns 1 for an
|
| + invalid handle, 0 for a valid handle. */
|
| +#define VALGRIND_DISCARD(_qzz_blkindex) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \
|
| + VG_USERREQ__DISCARD, \
|
| + 0, (_qzz_blkindex), 0, 0, 0)
|
| +
|
| +
|
| +/* Client-code macros to check the state of memory. */
|
| +
|
| +/* Check that memory at _qzz_addr is addressable for _qzz_len bytes.
|
| + If suitable addressibility is not established, Valgrind prints an
|
| + error message and returns the address of the first offending byte.
|
| + Otherwise it returns zero. */
|
| +#define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(_qzz_addr,_qzz_len) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
|
| + VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, \
|
| + (_qzz_addr), (_qzz_len), 0, 0, 0)
|
| +
|
| +/* Check that memory at _qzz_addr is addressable and defined for
|
| + _qzz_len bytes. If suitable addressibility and definedness are not
|
| + established, Valgrind prints an error message and returns the
|
| + address of the first offending byte. Otherwise it returns zero. */
|
| +#define VALGRIND_CHECK_MEM_IS_DEFINED(_qzz_addr,_qzz_len) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
|
| + VG_USERREQ__CHECK_MEM_IS_DEFINED, \
|
| + (_qzz_addr), (_qzz_len), 0, 0, 0)
|
| +
|
| +/* Use this macro to force the definedness and addressibility of an
|
| + lvalue to be checked. If suitable addressibility and definedness
|
| + are not established, Valgrind prints an error message and returns
|
| + the address of the first offending byte. Otherwise it returns
|
| + zero. */
|
| +#define VALGRIND_CHECK_VALUE_IS_DEFINED(__lvalue) \
|
| + VALGRIND_CHECK_MEM_IS_DEFINED( \
|
| + (volatile unsigned char *)&(__lvalue), \
|
| + (unsigned long)(sizeof (__lvalue)))
|
| +
|
| +
|
| +/* Do a full memory leak check (like --leak-check=full) mid-execution. */
|
| +#define VALGRIND_DO_LEAK_CHECK \
|
| + {unsigned long _qzz_res; \
|
| + VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
|
| + VG_USERREQ__DO_LEAK_CHECK, \
|
| + 0, 0, 0, 0, 0); \
|
| + }
|
| +
|
| +/* Do a summary memory leak check (like --leak-check=summary) mid-execution. */
|
| +#define VALGRIND_DO_QUICK_LEAK_CHECK \
|
| + {unsigned long _qzz_res; \
|
| + VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
|
| + VG_USERREQ__DO_LEAK_CHECK, \
|
| + 1, 0, 0, 0, 0); \
|
| + }
|
| +
|
| +/* Return number of leaked, dubious, reachable and suppressed bytes found by
|
| + all previous leak checks. They must be lvalues. */
|
| +#define VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed) \
|
| + /* For safety on 64-bit platforms we assign the results to private
|
| + unsigned long variables, then assign these to the lvalues the user
|
| + specified, which works no matter what type 'leaked', 'dubious', etc
|
| + are. We also initialise '_qzz_leaked', etc because
|
| + VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as
|
| + defined. */ \
|
| + {unsigned long _qzz_res; \
|
| + unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \
|
| + unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \
|
| + VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
|
| + VG_USERREQ__COUNT_LEAKS, \
|
| + &_qzz_leaked, &_qzz_dubious, \
|
| + &_qzz_reachable, &_qzz_suppressed, 0); \
|
| + leaked = _qzz_leaked; \
|
| + dubious = _qzz_dubious; \
|
| + reachable = _qzz_reachable; \
|
| + suppressed = _qzz_suppressed; \
|
| + }
|
| +
|
| +/* Return number of leaked, dubious, reachable and suppressed bytes found by
|
| + all previous leak checks. They must be lvalues. */
|
| +#define VALGRIND_COUNT_LEAK_BLOCKS(leaked, dubious, reachable, suppressed) \
|
| + /* For safety on 64-bit platforms we assign the results to private
|
| + unsigned long variables, then assign these to the lvalues the user
|
| + specified, which works no matter what type 'leaked', 'dubious', etc
|
| + are. We also initialise '_qzz_leaked', etc because
|
| + VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as
|
| + defined. */ \
|
| + {unsigned long _qzz_res; \
|
| + unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \
|
| + unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \
|
| + VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
|
| + VG_USERREQ__COUNT_LEAK_BLOCKS, \
|
| + &_qzz_leaked, &_qzz_dubious, \
|
| + &_qzz_reachable, &_qzz_suppressed, 0); \
|
| + leaked = _qzz_leaked; \
|
| + dubious = _qzz_dubious; \
|
| + reachable = _qzz_reachable; \
|
| + suppressed = _qzz_suppressed; \
|
| + }
|
| +
|
| +
|
| +/* Get the validity data for addresses [zza..zza+zznbytes-1] and copy it
|
| + into the provided zzvbits array. Return values:
|
| + 0 if not running on valgrind
|
| + 1 success
|
| + 2 [previously indicated unaligned arrays; these are now allowed]
|
| + 3 if any parts of zzsrc/zzvbits are not addressable.
|
| + The metadata is not copied in cases 0, 2 or 3 so it should be
|
| + impossible to segfault your system by using this call.
|
| +*/
|
| +#define VALGRIND_GET_VBITS(zza,zzvbits,zznbytes) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
|
| + VG_USERREQ__GET_VBITS, \
|
| + (const char*)(zza), \
|
| + (char*)(zzvbits), \
|
| + (zznbytes), 0, 0)
|
| +
|
| +/* Set the validity data for addresses [zza..zza+zznbytes-1], copying it
|
| + from the provided zzvbits array. Return values:
|
| + 0 if not running on valgrind
|
| + 1 success
|
| + 2 [previously indicated unaligned arrays; these are now allowed]
|
| + 3 if any parts of zza/zzvbits are not addressable.
|
| + The metadata is not copied in cases 0, 2 or 3 so it should be
|
| + impossible to segfault your system by using this call.
|
| +*/
|
| +#define VALGRIND_SET_VBITS(zza,zzvbits,zznbytes) \
|
| + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
|
| + VG_USERREQ__SET_VBITS, \
|
| + (const char*)(zza), \
|
| + (const char*)(zzvbits), \
|
| + (zznbytes), 0, 0 )
|
| +
|
| +#endif
|
| +
|
|
|