From d9e803fa14295c584c784c4244aab95de41eefdf Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sun, 18 Mar 2012 18:05:05 -0400 Subject: [PATCH] Unbreak random array declarators. Passing really big values to gsl_rng_uniform_int is not supported by the library. Instead, add a function to generate any possible uintmax_t value uniformly at random. --- test/declgen.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/declgen.c b/test/declgen.c index af7dd8d..d7bdbc1 100644 --- a/test/declgen.c +++ b/test/declgen.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -268,6 +269,20 @@ gen_declspecs(struct gen_rng *rng, unsigned flags) return gen_randomize_specs(rng, s); } +static uintmax_t gen_uintmax(struct gen_rng *rng) +{ + unsigned char tmp; + uintmax_t ret = 0; + + for (size_t i = 0; i < sizeof ret; i++) { + tmp = gsl_rng_uniform_int(rng->rng, UCHAR_MAX+1); + ret <<= CHAR_BIT; + ret |= tmp; + } + + return ret; +} + /* * Generate a random array declarator, selecting one of four possibilities * uniformly at random. @@ -289,7 +304,7 @@ static void gen_array(struct gen_rng *rng, struct cdecl_declarator *d) d->u.array.length = 0; break; case 3: - d->u.array.length = gsl_rng_uniform_int(rng->rng, -1); + d->u.array.length = gen_uintmax(rng); break; default: assert(0); -- 2.43.2