mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 01:51:29 +00:00
Fix memcheck/tests/undef_malloc_args failure.
Try harder to trigger a memcheck error if a value is (partially) undefined.
This commit is contained in:
parent
01f1936b12
commit
3af8e12b0d
@ -216,9 +216,19 @@ static void init(void);
|
||||
Apart of allowing memcheck to detect an error, the macro
|
||||
TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED has no effect and
|
||||
has a minimal cost for other tools replacing malloc functions.
|
||||
|
||||
Creating an "artificial" use of _x that works reliably is not entirely
|
||||
straightforward. Simply comparing it against zero often produces no
|
||||
warning if _x contains at least one nonzero bit is defined, because
|
||||
Memcheck knows that the result of the comparison will be defined (cf
|
||||
expensiveCmpEQorNE).
|
||||
|
||||
Really we want to PCast _x, so as to create a value which is entirely
|
||||
undefined if any bit of _x is undefined. But there's no portable way to do
|
||||
that.
|
||||
*/
|
||||
#define TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(x) \
|
||||
if ((ULong)x == 0) __asm__ __volatile__( "" ::: "memory" )
|
||||
#define TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(_x) \
|
||||
if ((UWord)(_x) == 0) __asm__ __volatile__( "" ::: "memory" )
|
||||
|
||||
/*---------------------- malloc ----------------------*/
|
||||
|
||||
@ -504,7 +514,7 @@ static void init(void);
|
||||
void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p) \
|
||||
{ \
|
||||
DO_INIT; \
|
||||
TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone); \
|
||||
TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord)zone ^ (UWord)p); \
|
||||
MALLOC_TRACE(#fnname "(%p, %p)\n", zone, p ); \
|
||||
if (p == NULL) \
|
||||
return; \
|
||||
|
||||
@ -11,29 +11,29 @@ int main (int argc, char*argv[])
|
||||
|
||||
{
|
||||
size_t size = def_size;
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&size, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&size, sizeof(size));
|
||||
p = malloc(size);
|
||||
}
|
||||
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&p, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&p, sizeof(p));
|
||||
new_p = realloc(p, def_size);
|
||||
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, sizeof(new_p));
|
||||
new_p = realloc(new_p, def_size);
|
||||
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, sizeof(new_p));
|
||||
free (new_p);
|
||||
|
||||
{
|
||||
size_t nmemb = 1;
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&nmemb, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&nmemb, sizeof(nmemb));
|
||||
new_p = calloc(nmemb, def_size);
|
||||
free (new_p);
|
||||
}
|
||||
#if 0
|
||||
{
|
||||
size_t alignment = 1;
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&alignment, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&alignment, sizeof(alignment));
|
||||
new_p = memalign(alignment, def_size);
|
||||
free(new_p);
|
||||
}
|
||||
@ -41,14 +41,14 @@ int main (int argc, char*argv[])
|
||||
{
|
||||
size_t nmemb = 16;
|
||||
size_t size = def_size;
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&size, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&size, sizeof(size));
|
||||
new_p = memalign(nmemb, size);
|
||||
free(new_p);
|
||||
}
|
||||
|
||||
{
|
||||
size_t size = def_size;
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&size, 1);
|
||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(&size, sizeof(size));
|
||||
new_p = valloc(size);
|
||||
free (new_p);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user