On Wed, Apr 24, 2013 at 12:45 AM, John Reiser <[email protected]> wrote:
>> Does valgrind provide any replacements for glibc's
>> |__malloc_initialize_hook()| ? It seems this call and it's |*hook*()|
>> siblings are depreciated now (at least in SuSE >=12.3) ...
>
> There is no glibc replacement.  [And the reasoning is correct.]
> There is no valgrind replacement.
> You must change your basic approach.
>
> We went through this just 6 months ago.
> Check the archives of this mailing list:
>
>    [Valgrind-users] __malloc_hook
>    Amir Szekely  <[email protected]>
>    10/19/2012
>
> That thread contains code that works.
> [The modification to detect the first use is obvious.]

Grumpf... I tried that... but the combination how the stuff I'd like
to instrument+debug is build+used makes that solution more or less
impossible (for example... the allocator system lives in a seperate
namespace, e.g. it has |malloc()|&&|free()| etc. but all symbols are
prefixed with |_ast|, e.g. |_ast_malloc()|, |_ast_free()| etc.).

I tried to work around the issues with the API provided in
<valgrind/valgrind.h> ... but it seems this doesn't detect any
read-from-unallocated etc. or even the plain double-free situations
(patch below) ... erm... is the API around
|VALGRIND_MALLOCLIKE_BLOCK()| know to work in valgrind-3.8.1 ?

-- snip --
--- src/lib/libast/vmalloc/vmbest.c      2012-06-28 22:12:14.000000000 +0200
+++ src/lib/libast/vmalloc/vmbest.c     2013-04-24 03:03:44.207373019 +0200
@@ -10,40 +10,42 @@
 *          http://www.eclipse.org/org/documents/epl-v10.html           *
 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
 *                                                                      *
 *              Information and Software Systems Research               *
 *                            AT&T Research                             *
 *                           Florham Park NJ                            *
 *                                                                      *
 *                 Glenn Fowler <[email protected]>                  *
 *                  David Korn <[email protected]>                   *
 *                   Phong Vo <[email protected]>                    *
 *                                                                      *
 ***********************************************************************/
 #if defined(_UWIN) && defined(_BLD_ast)

 void _STUB_vmbest(){}

 #else

 #include       "vmhdr.h"

+#include <valgrind/valgrind.h>
+
 /*     Best-fit allocation method. This is based on a best-fit strategy
 **     using a splay tree for storage of lists of free blocks of the same
 **     size. Recent free blocks may be cached for fast reuse.
 **
 **     Written by Kiem-Phong Vo, [email protected], 01/16/94.
 */

 #ifdef DEBUG
 static int     N_free;         /* # of free calls                      */
 static int     N_alloc;        /* # of alloc calls                     */
 static int     N_resize;       /* # of resize calls                    */
 static int     N_wild;         /* # allocated from the wild block      */
 static int     N_last;         /* # allocated from last free block     */
 static int     N_reclaim;      /* # of bestreclaim calls               */
 #endif /*DEBUG*/

 #define COMPACT                8       /* factor to decide when to
compact     */

 /* Check to see if a block is in the free tree */
 #if __STD_C
@@ -692,41 +694,44 @@

                        if(VMWILD(vd,np))
                        {       SIZE(np) &= ~BITS;
                                SELF(np) = np;
                                ap = NEXT(np); /**/ASSERT(ISBUSY(SIZE(ap)));
                                SETPFREE(SIZE(ap));
                                vd->wild = np;
                        }
                        else    vd->free = np;
                }

                SETBUSY(SIZE(tp));
        }

 done:
        if(tp && !local && (vd->mode&VM_TRACE) && _Vmtrace &&
VMETHOD(vd) == VM_MTBEST)
                (*_Vmtrace)(vm,NIL(Vmuchar_t*),(Vmuchar_t*)DATA(tp),orgsize,0);

        CLRLOCK(vm,local); /**/ASSERT(_vmbestcheck(vd, NIL(Block_t*)) == 0);

-       return tp ? DATA(tp) : NIL(Void_t*);
+       void *res= tp ? DATA(tp) : NIL(Void_t*);
+       if (!local)
+               VALGRIND_MALLOCLIKE_BLOCK(res, size, 0, 0);
+       return res;
 }

 #if __STD_C
 static long bestaddr(Vmalloc_t* vm, Void_t* addr, int local )
 #else
 static long bestaddr(vm, addr, local)
 Vmalloc_t*     vm;     /* region allocating from       */
 Void_t*                addr;   /* address to check             */
 int            local;
 #endif
 {
        reg Seg_t*      seg;
        reg Block_t     *b, *endb;
        reg long        offset;
        reg Vmdata_t*   vd = vm->data;

        /**/ASSERT(local ? (vd->lock == 1) : 1 );
        SETLOCK(vm, local);

        offset = -1L; b = endb = NIL(Block_t*);
@@ -816,40 +821,43 @@
                        vd->free = bp;
                else
                {       /**/ASSERT(!vmonlist(CACHE(vd)[S_CACHE], bp) );
                        LINK(bp) = CACHE(vd)[S_CACHE];
                        CACHE(vd)[S_CACHE] = bp;
                }

                /* coalesce on freeing large blocks to avoid fragmentation */
                if(SIZE(bp) >= 2*vd->incr)
                {       bestreclaim(vd,NIL(Block_t*),0);
                        if(vd->wild && SIZE(vd->wild) >= COMPACT*vd->incr)
                                KPVCOMPACT(vm,bestcompact);
                }
        }

        if(!local && _Vmtrace && (vd->mode&VM_TRACE) && VMETHOD(vd) ==
VM_MTBEST )
                (*_Vmtrace)(vm,(Vmuchar_t*)data,NIL(Vmuchar_t*), (s&~BITS), 0);

        CLRLOCK(vm, local); /**/ASSERT(_vmbestcheck(vd, NIL(Block_t*)) == 0);

+       if (!local)
+               VALGRIND_FREELIKE_BLOCK(data, 0);
+
        return 0;
 }

 #if __STD_C
 static Void_t* bestresize(Vmalloc_t* vm, Void_t* data, reg size_t
size, int type, int local)
 #else
 static Void_t* bestresize(vm, data, size, type, local)
 Vmalloc_t*     vm;             /* region allocating from       */
 Void_t*                data;           /* old block of data            */
 reg size_t     size;           /* new size                     */
 int            type;           /* !=0 to move, <0 for not copy */
 int            local;
 #endif
 {
        reg Block_t     *rp, *np, *t;
        size_t          s, bs;
        size_t          oldz = 0,  orgsize = size;
        Void_t          *oldd = 0, *orgdata = data;
        Vmdata_t        *vd = vm->data;

@@ -936,40 +944,46 @@
                        {       if(type&VM_RSCOPY)
                                        memcpy(data, oldd, bs);

                        do_free: /* reclaim these right away */
                                SETJUNK(SIZE(rp));
                                LINK(rp) = CACHE(vd)[S_CACHE];
                                CACHE(vd)[S_CACHE] = rp;
                                bestreclaim(vd, NIL(Block_t*), S_CACHE);
                        }
                }
        }

        if(data && (type&VM_RSZERO) && (size = SIZE(BLOCK(data))&~BITS) > oldz )
                memset((Void_t*)((Vmuchar_t*)data + oldz), 0, size-oldz);

        if(!local && _Vmtrace && data && (vd->mode&VM_TRACE) &&
VMETHOD(vd) == VM_MTBEST)
                (*_Vmtrace)(vm, (Vmuchar_t*)orgdata, (Vmuchar_t*)data,
orgsize, 0);

        CLRLOCK(vm, local); /**/ASSERT(_vmbestcheck(vd, NIL(Block_t*)) == 0);

+       if (!local)
+       {
+               VALGRIND_FREELIKE_BLOCK(orgdata, 0);
+               VALGRIND_MALLOCLIKE_BLOCK(data, size, 0, 0);
+       }
+
        return data;
 }

 #if __STD_C
 static long bestsize(Vmalloc_t* vm, Void_t* addr, int local )
 #else
 static long bestsize(vm, addr, local)
 Vmalloc_t*     vm;     /* region allocating from       */
 Void_t*                addr;   /* address to check             */
 int            local;
 #endif
 {
        Seg_t           *seg;
        Block_t         *b, *endb;
        long            size;
        Vmdata_t        *vd = vm->data;

        SETLOCK(vm, local);

        size = -1L;
-- snip --

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) [email protected]
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
_______________________________________________
Valgrind-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to