fine-grained valgrind support (warning: slow)
This commit is contained in:
parent
2effa0f98c
commit
7731d1136b
3
Makefile
3
Makefile
|
@ -9,9 +9,6 @@ CFLAGS=-Wall -std=c89 -Werror -pedantic -fPIC -g -Iinclude -I. -Wno-unused-funct
|
|||
|
||||
tests: string_tests htable_tests
|
||||
|
||||
with_valgrind:
|
||||
make EXTRACFLAGS=-DUNS_VALGRIND
|
||||
|
||||
COMMON_OBJECTS=uns.o
|
||||
|
||||
uns.o: uns.c include/uns.h
|
||||
|
|
23
cheney_c89.c
23
cheney_c89.c
|
@ -16,14 +16,21 @@
|
|||
*/
|
||||
#include <stdio.h>
|
||||
|
||||
/* XXX: Currently valgrind marks the header region as valid for all
|
||||
* functions, when it should only be valid inside allocator calls.
|
||||
*/
|
||||
#ifdef UNS_VALGRIND
|
||||
# include <valgrind/valgrind.h>
|
||||
# include <valgrind/memcheck.h>
|
||||
# define REDZONE 16
|
||||
#else
|
||||
# define REDZONE 0
|
||||
# define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) (void)0
|
||||
# define VALGRIND_DESTROY_MEMPOOL(pool) (void)0
|
||||
# define VALGRIND_MEMPOOL_ALLOC(pool, ptr, siz) (void)0
|
||||
# define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(p, len) 0
|
||||
# define VALGRIND_MAKE_MEM_DEFINED(p, len) (void)0
|
||||
# define VALGRIND_MAKE_MEM_NOACCESS(p, len) (void)0
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -134,7 +141,13 @@ static void hdr_read(struct hdr *hdr, unsigned char *p)
|
|||
assert(hdr);
|
||||
assert(p);
|
||||
|
||||
if (VALGRIND_CHECK_MEM_IS_ADDRESSABLE(p + HDR_LEN, 1) != 0)
|
||||
abort();
|
||||
|
||||
VALGRIND_MAKE_MEM_DEFINED(p, HDR_LEN);
|
||||
memcpy(&hdr->len, p, HDR_LEN);
|
||||
VALGRIND_MAKE_MEM_NOACCESS(p, HDR_LEN);
|
||||
|
||||
if (hdr->len < 0) {
|
||||
hdr->typ = RECORD;
|
||||
hdr->len = -hdr->len;
|
||||
|
@ -144,6 +157,9 @@ static void hdr_read(struct hdr *hdr, unsigned char *p)
|
|||
} else {
|
||||
hdr->typ = REGION;
|
||||
}
|
||||
|
||||
if (VALGRIND_CHECK_MEM_IS_ADDRESSABLE(p + HDR_LEN, hdr->len) != 0)
|
||||
abort();
|
||||
}
|
||||
|
||||
/** Destructure header from a pointer to a region.
|
||||
|
@ -178,7 +194,12 @@ static void hdr_write_direct(struct hdr *hdr, unsigned char *p)
|
|||
case RECORD: s = -hdr->len; break;
|
||||
}
|
||||
|
||||
if (VALGRIND_CHECK_MEM_IS_ADDRESSABLE(p + HDR_LEN, hdr->len) != 0)
|
||||
abort();
|
||||
|
||||
VALGRIND_MAKE_MEM_DEFINED(p, HDR_LEN);
|
||||
memcpy(p, &s, HDR_LEN);
|
||||
VALGRIND_MAKE_MEM_NOACCESS(p, HDR_LEN);
|
||||
}
|
||||
|
||||
/** Write to the header of a region.
|
||||
|
@ -225,7 +246,7 @@ static void *raw_alloc(struct ctx *ctx, uns_sword len, int is_record)
|
|||
assert(enough_space(ctx, len));
|
||||
|
||||
p = ctx->tospace_alloc;
|
||||
VALGRIND_MEMPOOL_ALLOC(ctx->tospace, p, len);
|
||||
VALGRIND_MEMPOOL_ALLOC(ctx->tospace, p + HDR_LEN, len - HDR_LEN);
|
||||
|
||||
hdr_write_direct(&hdr, p);
|
||||
ctx->tospace_alloc += len + REDZONE;
|
||||
|
|
Loading…
Reference in New Issue