Mark Wielaard 81c8a9
commit 262275da43425ba2b8c240e47063e36b39167996
Mark Wielaard 81c8a9
Author: Mark Wielaard <mark@klomp.org>
Mark Wielaard 81c8a9
Date:   Wed Dec 12 13:55:01 2018 +0100
Mark Wielaard 81c8a9
Mark Wielaard 81c8a9
    Fix memcheck/tests/undef_malloc_args testcase.
Mark Wielaard 81c8a9
Mark Wielaard 81c8a9
diff --git a/coregrind/m_replacemalloc/vg_replace_malloc.c b/coregrind/m_replacemalloc/vg_replace_malloc.c
Mark Wielaard 81c8a9
index 28bdb4a..564829a 100644
Mark Wielaard 81c8a9
--- a/coregrind/m_replacemalloc/vg_replace_malloc.c
Mark Wielaard 81c8a9
+++ b/coregrind/m_replacemalloc/vg_replace_malloc.c
Mark Wielaard 81c8a9
@@ -216,9 +216,19 @@ static void init(void);
Mark Wielaard 81c8a9
    Apart of allowing memcheck to detect an error, the macro
Mark Wielaard 81c8a9
    TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED has no effect and
Mark Wielaard 81c8a9
    has a minimal cost for other tools replacing malloc functions.
Mark Wielaard 81c8a9
+
Mark Wielaard 81c8a9
+   Creating an "artificial" use of _x that works reliably is not entirely
Mark Wielaard 81c8a9
+   straightforward.  Simply comparing it against zero often produces no
Mark Wielaard 81c8a9
+   warning if _x contains at least one nonzero bit is defined, because
Mark Wielaard 81c8a9
+   Memcheck knows that the result of the comparison will be defined (cf
Mark Wielaard 81c8a9
+   expensiveCmpEQorNE).
Mark Wielaard 81c8a9
+
Mark Wielaard 81c8a9
+   Really we want to PCast _x, so as to create a value which is entirely
Mark Wielaard 81c8a9
+   undefined if any bit of _x is undefined.  But there's no portable way to do
Mark Wielaard 81c8a9
+   that.
Mark Wielaard 81c8a9
 */
Mark Wielaard 81c8a9
-#define TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(x) \
Mark Wielaard 81c8a9
-   if ((ULong)x == 0) __asm__ __volatile__( "" ::: "memory" )
Mark Wielaard 81c8a9
+#define TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(_x) \
Mark Wielaard 81c8a9
+   if ((UWord)(_x) == 0) __asm__ __volatile__( "" ::: "memory" )
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
 /*---------------------- malloc ----------------------*/
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
@@ -504,7 +514,7 @@ static void init(void);
Mark Wielaard 81c8a9
    void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p)  \
Mark Wielaard 81c8a9
    { \
Mark Wielaard 81c8a9
       DO_INIT; \
Mark Wielaard 81c8a9
-      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone);	\
Mark Wielaard 81c8a9
+      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord)zone ^ (UWord)p); \
Mark Wielaard 81c8a9
       MALLOC_TRACE(#fnname "(%p, %p)\n", zone, p ); \
Mark Wielaard 81c8a9
       if (p == NULL)  \
Mark Wielaard 81c8a9
          return; \
Mark Wielaard 81c8a9
diff --git a/memcheck/tests/undef_malloc_args.c b/memcheck/tests/undef_malloc_args.c
Mark Wielaard 81c8a9
index 99e2799..654d70d 100644
Mark Wielaard 81c8a9
--- a/memcheck/tests/undef_malloc_args.c
Mark Wielaard 81c8a9
+++ b/memcheck/tests/undef_malloc_args.c
Mark Wielaard 81c8a9
@@ -11,29 +11,29 @@ int main (int argc, char*argv[])
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
    {
Mark Wielaard 81c8a9
       size_t size = def_size;
Mark Wielaard 81c8a9
-      (void) VALGRIND_MAKE_MEM_UNDEFINED(&size, 1);
Mark Wielaard 81c8a9
+      (void) VALGRIND_MAKE_MEM_UNDEFINED(&size, sizeof(size));
Mark Wielaard 81c8a9
       p = malloc(size);
Mark Wielaard 81c8a9
    }
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
-   (void) VALGRIND_MAKE_MEM_UNDEFINED(&p, 1);
Mark Wielaard 81c8a9
+   (void) VALGRIND_MAKE_MEM_UNDEFINED(&p, sizeof(p));
Mark Wielaard 81c8a9
    new_p = realloc(p, def_size);
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
-   (void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, 1);
Mark Wielaard 81c8a9
+   (void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, sizeof(new_p));
Mark Wielaard 81c8a9
    new_p = realloc(new_p, def_size);
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
-   (void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, 1);
Mark Wielaard 81c8a9
+   (void) VALGRIND_MAKE_MEM_UNDEFINED(&new_p, sizeof(new_p));
Mark Wielaard 81c8a9
    free (new_p);
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
    {
Mark Wielaard 81c8a9
       size_t nmemb = 1;
Mark Wielaard 81c8a9
-      (void) VALGRIND_MAKE_MEM_UNDEFINED(&nmemb, 1);
Mark Wielaard 81c8a9
+      (void) VALGRIND_MAKE_MEM_UNDEFINED(&nmemb, sizeof(nmemb));
Mark Wielaard 81c8a9
       new_p = calloc(nmemb, def_size);
Mark Wielaard 81c8a9
       free (new_p);
Mark Wielaard 81c8a9
    }
Mark Wielaard 81c8a9
 #if 0
Mark Wielaard 81c8a9
    {
Mark Wielaard 81c8a9
       size_t alignment = 1;
Mark Wielaard 81c8a9
-      (void) VALGRIND_MAKE_MEM_UNDEFINED(&alignment, 1);
Mark Wielaard 81c8a9
+      (void) VALGRIND_MAKE_MEM_UNDEFINED(&alignment, sizeof(alignment));
Mark Wielaard 81c8a9
       new_p = memalign(alignment, def_size);
Mark Wielaard 81c8a9
       free(new_p);
Mark Wielaard 81c8a9
    }
Mark Wielaard 81c8a9
@@ -41,14 +41,14 @@ int main (int argc, char*argv[])
Mark Wielaard 81c8a9
    {
Mark Wielaard 81c8a9
       size_t nmemb = 16;
Mark Wielaard 81c8a9
       size_t size = def_size;
Mark Wielaard 81c8a9
-      (void) VALGRIND_MAKE_MEM_UNDEFINED(&size, 1);
Mark Wielaard 81c8a9
+      (void) VALGRIND_MAKE_MEM_UNDEFINED(&size, sizeof(size));
Mark Wielaard 81c8a9
       new_p = memalign(nmemb, size);
Mark Wielaard 81c8a9
       free(new_p);
Mark Wielaard 81c8a9
    }
Mark Wielaard 81c8a9
 
Mark Wielaard 81c8a9
    {
Mark Wielaard 81c8a9
       size_t size = def_size;
Mark Wielaard 81c8a9
-      (void) VALGRIND_MAKE_MEM_UNDEFINED(&size, 1);
Mark Wielaard 81c8a9
+      (void) VALGRIND_MAKE_MEM_UNDEFINED(&size, sizeof(size));
Mark Wielaard 81c8a9
       new_p = valloc(size);
Mark Wielaard 81c8a9
       free (new_p);
Mark Wielaard 81c8a9
    }