From 582d63a4d10968f6729410310fdd520a41941b17 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 29 Feb 2012 21:56:36 -0500 Subject: [PATCH] Free memory in randomdecl. Kind of silly to continuously allocate memory for a program intended to run a long time. --- test/declgen.c | 73 +++++++++++++++++++++++++++++++++++++++++++---- test/declgen.h | 5 ++++ test/randomdecl.c | 9 ++++-- 3 files changed, 79 insertions(+), 8 deletions(-) diff --git a/test/declgen.c b/test/declgen.c index ac9d23e..9c774ff 100644 --- a/test/declgen.c +++ b/test/declgen.c @@ -390,11 +390,74 @@ struct gen_rng *gen_alloc_rng(const char *seed_str) return NULL; } - rng = malloc(sizeof *rng); - if (rng) { - rng->rng = gsl_rng_alloc(gsl_rng_mt19937); - gsl_rng_set(rng->rng, seed); - } + rng = malloc_nofail(sizeof *rng); + rng->rng = gsl_rng_alloc(gsl_rng_mt19937); + gsl_rng_set(rng->rng, seed); return rng; } + +void gen_free_rng(struct gen_rng *rng) +{ + if (rng) + gsl_rng_free(rng->rng); + free(rng); +} + +static void gen_free_parameters(struct cdecl *x) +{ + struct cdecl *p; + + while (x) { + p = x->next; + + gen_free_declspecs(x->specifiers); + gen_free_declarators(x->declarators); + free(x); + + x = p; + } +} + +void gen_free_declspecs(struct cdecl_declspec *x) +{ + struct cdecl_declspec *p; + + while (x) { + p = x->next; + free(x->ident); + free(x); + x = p; + } +} + +void gen_free_declarators(struct cdecl_declarator *x) +{ + struct cdecl_declarator *p; + + while (x) { + p = x->child; + + switch (x->type) { + case CDECL_DECL_NULL: + break; + case CDECL_DECL_IDENT: + free(x->u.ident); + break; + case CDECL_DECL_POINTER: + gen_free_declspecs(x->u.pointer.qualifiers); + break; + case CDECL_DECL_ARRAY: + free(x->u.array.vla); + break; + case CDECL_DECL_FUNCTION: + gen_free_parameters(x->u.function.parameters); + break; + default: + assert(0); + } + + free(x); + x = p; + } +} diff --git a/test/declgen.h b/test/declgen.h index 159c794..414f04e 100644 --- a/test/declgen.h +++ b/test/declgen.h @@ -16,6 +16,11 @@ struct cdecl_declspec *gen_randomize_specs(struct gen_rng *rng, struct cdecl_declspec *specs); struct cdecl_declspec *gen_declspecs(struct gen_rng *rng, unsigned flags); struct cdecl_declarator *gen_declarators(struct gen_rng *rng); + struct gen_rng *gen_alloc_rng(const char *seed); +void gen_free_rng(struct gen_rng *rng); + +void gen_free_declspecs(struct cdecl_declspec *x); +void gen_free_declarators(struct cdecl_declarator *x); #endif diff --git a/test/randomdecl.c b/test/randomdecl.c index 5e8a4a9..0d53af3 100644 --- a/test/randomdecl.c +++ b/test/randomdecl.c @@ -114,11 +114,14 @@ int main(int argc, char **argv) for (unsigned long i = 0; !count || i < count; i++) { decl = random_decl(rng); - if (!decl) - return EXIT_FAILURE; - test_print_decl(decl); + + gen_free_declspecs(decl->specifiers); + gen_free_declarators(decl->declarators); + free(decl); } + gen_free_rng(rng); + return EXIT_SUCCESS; } -- 2.43.0