From 7b0be4885117b95a169274fd922680eb20d43ce8 Mon Sep 17 00:00:00 2001 From: Petter Urkedal Date: Mon, 19 May 2014 22:36:55 +0200 Subject: [PATCH] Use magic header on objects to improve disclaim_test * tests/disclaim_test.c (my_assert): Call fflush(). * tests/disclaim_test.c (pair_s): Replace is_valid with "magic" field. * tests/disclaim_test.c (pair_magic): New const static variable. * tests/disclaim_test.c (is_pair): New function. * tests/disclaim_test.c (pair_dct, pair_new): Set "magic" field and use is_pair() instead of is_valid for assertion checking. --- tests/disclaim_test.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tests/disclaim_test.c b/tests/disclaim_test.c index 7bba6fb8..659bf106 100644 --- a/tests/disclaim_test.c +++ b/tests/disclaim_test.c @@ -29,6 +29,7 @@ #define my_assert(e) \ if (!(e)) { \ + fflush(stdout); \ fprintf(stderr, "Assertion failure, line %d: " #e "\n", __LINE__); \ exit(-1); \ } @@ -73,12 +74,19 @@ void test_misc_sizes(void) typedef struct pair_s *pair_t; struct pair_s { - int is_valid; + char magic[16]; int checksum; pair_t car; pair_t cdr; }; +static const char *pair_magic = "PAIR_MAGIC_BYTES"; + +int is_pair(pair_t p) +{ + return memcmp(p->magic, pair_magic, sizeof(p->magic)) == 0; +} + void GC_CALLBACK pair_dct(void *obj, void *cd) { pair_t p = obj; @@ -90,16 +98,16 @@ void GC_CALLBACK pair_dct(void *obj, void *cd) (void *)p, (void *)p->car, (void *)p->cdr); # endif my_assert(GC_base(obj)); - my_assert(p->is_valid); - my_assert(!p->car || p->car->is_valid); - my_assert(!p->cdr || p->cdr->is_valid); + my_assert(is_pair(p)); + my_assert(!p->car || is_pair(p->car)); + my_assert(!p->cdr || is_pair(p->cdr)); checksum = 782; if (p->car) checksum += p->car->checksum; if (p->cdr) checksum += p->cdr->checksum; my_assert(p->checksum == checksum); /* Invalidate it. */ - p->is_valid = 0; + memset(p->magic, '*', sizeof(p->magic)); p->checksum = 0; p->car = cd; p->cdr = NULL; @@ -112,12 +120,13 @@ pair_new(pair_t car, pair_t cdr) static const struct GC_finalizer_closure fc = { pair_dct, NULL }; p = GC_finalized_malloc(sizeof(struct pair_s), &fc); + my_assert(!is_pair(p)); if (p == NULL) { fprintf(stderr, "Out of memory!\n"); exit(3); } my_assert(memeq(p, 0, sizeof(struct pair_s))); - p->is_valid = 1; + memcpy(p->magic, pair_magic, sizeof(p->magic)); p->checksum = 782 + (car? car->checksum : 0) + (cdr? cdr->checksum : 0); p->car = car; p->cdr = cdr; -- 2.50.1