On 8/6/19 11:47 AM, Ruurd Beerstra wrote:
Hi,

We have a custom allocator which I have instrumented with VALGRIND macro’s so we can run our software under valgrind and detect memory abuse and leaks.

Works great, and has done so for many years now.

That allocator used to use sbrk() to get the raw memory in large chunks, and then uses VALGRIND_MALLOCLIKE_BLOCK when it doled out smaller chunks to the applications.

But sbrk() does not work well when a single application uses multiple allocators, and our software now links with 3^rd party code which has its own ideas about allocation.

That caused problems and instability.

So, our custom allocator now uses the system ‘malloc()’ instead of sbrk() to allocate large chunks, which solves the interference problems between allocators.
That stabilized the software.

However, now valgrind gets confused: It sees overlapping mallocs() (the smaller VALGRIND_MALLOCLIKE_BLOCKS are within the large chunks allocated with malloc()).

I’m now struggling with the instrumentation in our allocator but I can’t get it to work.

The error reports I get are just plain wrong: It says stuff like:

2019-08-06 00:57:20: ==30298== Invalid read of size 1

2019-08-06 00:57:20: ==30298==    at 0x4059CF: main (valgrindTest.c:126)

2019-08-06 00:57:20: ==30298==  Address 0x5e43878 is 72 bytes inside a block of size 65,536 alloc'd

2019-08-06 00:57:20: ==30298==    at 0x4C29DDB: malloc (vg_replace_malloc.c:299)

2019-08-06 00:57:20: ==30298==    by 0x42DE98: mal_own_sbrk (al_alloc.c:4251)

2019-08-06 00:57:20: ==30298==    by 0x42E7E5: mal_inc_space (al_alloc.c:4442)

2019-08-06 00:57:20: ==30298==    by 0x4290E3: _mal_allocater (al_alloc.c:1915)

2019-08-06 00:57:20: ==30298==    by 0x428235: mal_allocater_c (al_alloc.c:1608)

2019-08-06 00:57:20: ==30298==    by 0x426C10: vmal_reserve_id (al_alloc.c:1131)

2019-08-06 00:57:20: ==30298==    by 0x42690B: mal_reserve_id (al_alloc.c:999)

2019-08-06 00:57:20: ==30298==    by 0x405495: main (valgrindTest.c:46)

So the offending byte is always in one of the “outer” malloced block of 64KB, which is not what I want. The stack is that of the allocator itself, also not what I want (the function is still called mal_own_sbrk, but that is  a misnomer now).


I'm not sure what the problem is (I've seen these "invalid read" reports in various situations, e.g. when accessing "padding" space in a struct, or when accessing areas marked as VALGRIND_MAKE_MEM_NOACCESS).

But maybe take a look at this:

https://github.com/postgres/postgres/blob/master/src/backend/utils/mmgr/aset.c

That's a custom allocator used by PostgreSQL, using pretty much exactly the same design like you do (based on malloc etc.), and it's heavily valgrind-enabled. And it works quite fine. So maybe you could look at what we're doing there and copy the instrumentation ...

Another example:

==16897==  Uninitialised value was created by a stack allocation

==16897==    at 0x492748: evt_get_3glLong_event (evt_fun.c:388)

==16897==

The memory in question here is allocated using our allocator (and not on the stack, so the reports is just wrong). Secondly, the rest of call stack is missing. Seems valgrind is confused here.


If I had to guess, I'd say this is complaining about the local variable not being initialized before use, not the memory allocated on heap.

regards
T.


_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to