From 6584887f01503999118c7f566979eccf26e54f35 Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Fri, 1 Dec 2017 14:50:59 +0100 Subject: [PATCH] Avoid signed integer overflow in Testing::rand --- tests/tests.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/tests.h b/tests/tests.h index 84da785348..eb4212e8f4 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -146,16 +146,24 @@ namespace Testing static int r[32]; static int k; static bool inited=false; + if (!inited || reseed) { //srand treats a seed 0 as 1 for some reason r[0]=(seed==0)?1:seed; + long int word = r[0]; for (int i=1; i<31; i++) { - r[i] = (16807LL * r[i-1]) % 2147483647; - if (r[i] < 0) - r[i] += 2147483647; + // This does: + // r[i] = (16807 * r[i-1]) % 2147483647; + // buit avoids overflowing 31 bits. + const long int hi = word / 127773; + const long int lo = word % 127773; + word = 16807 * lo - 2836 * hi; + if (word < 0) + word += 2147483647; + r[i] = word; } k=31; for (int i=31; i<34; i++) @@ -180,7 +188,7 @@ namespace Testing return (unsigned int)ret >> 1; } -// reseed our random number generator + // reseed our random number generator void srand(const int seed) { rand(true, seed); -- 2.39.5