From c31b7a8f6f0a300c927a79d687c8f3d335340bc8 Mon Sep 17 00:00:00 2001 From: Evan Nemerson Date: Thu, 30 Mar 2017 10:43:22 -0700 Subject: [PATCH 1/2] Handle rand_int_range with min == max without dividing by 0 https://github.com/nemequ/munit/issues/30 --- munit.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/munit.c b/munit.c index 00ede07..f051ab8 100644 --- a/munit.c +++ b/munit.c @@ -998,11 +998,15 @@ munit_rand_at_most(munit_uint32_t salt, munit_uint32_t max) { int munit_rand_int_range(int min, int max) { - munit_uint64_t range = (munit_uint64_t) max - (munit_uint64_t) min; + munit_uint64_t range; - if (min > max) + if (min == max) + return min; + else if (min > max) return munit_rand_int_range(max, min); + range = (munit_uint64_t) max - (munit_uint64_t) min; + if (range > (~((munit_uint32_t) 0U))) range = (~((munit_uint32_t) 0U)); From 389e5e23b0d5532460c9f33f2bceeb7752994a0c Mon Sep 17 00:00:00 2001 From: Sye van der Veen Date: Sat, 30 Nov 2024 18:12:03 -0500 Subject: [PATCH 2/2] Avoid divide-by-zero in munit_rand_state_at_most when max is zero --- munit.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/munit.c b/munit.c index f051ab8..f258333 100644 --- a/munit.c +++ b/munit.c @@ -962,6 +962,7 @@ munit_rand_memory(size_t size, munit_uint8_t data[MUNIT_ARRAY_PARAM(size)]) { } while (!munit_atomic_cas(&munit_rand_state, &old, state)); } +/* max cannot be zero. */ static munit_uint32_t munit_rand_state_at_most(munit_uint32_t* state, munit_uint32_t salt, munit_uint32_t max) { /* We want (UINT32_MAX + 1) % max, which in unsigned arithmetic is the same @@ -983,6 +984,7 @@ munit_rand_state_at_most(munit_uint32_t* state, munit_uint32_t salt, munit_uint3 return x % max; } +/* max cannot be zero. */ static munit_uint32_t munit_rand_at_most(munit_uint32_t salt, munit_uint32_t max) { munit_uint32_t old, state; @@ -1618,7 +1620,10 @@ munit_test_runner_run_test(MunitTestRunner* runner, * running a single test, but we don't want every test with * the same number of parameters to choose the same parameter * number, so use the test name as a primitive salt. */ - pidx = munit_rand_at_most(munit_str_hash(test_name), possible - 1); + if (possible > 1) + pidx = munit_rand_at_most(munit_str_hash(test_name), possible - 1); + else + pidx = 0; if (MUNIT_UNLIKELY(munit_parameters_add(¶ms_l, ¶ms, pe->name, pe->values[pidx]) != MUNIT_OK)) goto cleanup; } else {