r23493 - gnucash/trunk/src - Handle RAND_MAX < 2^32 in get_random_gint64()

John Ralls jralls at code.gnucash.org
Thu Dec 5 16:54:19 EST 2013


Author: jralls
Date: 2013-12-05 16:54:18 -0500 (Thu, 05 Dec 2013)
New Revision: 23493
Trac: http://svn.gnucash.org/trac/changeset/23493

Modified:
   gnucash/trunk/src/engine/test-core/test-engine-stuff.c
   gnucash/trunk/src/test-core/test-stuff.c
   gnucash/trunk/src/test-core/test-stuff.h
Log:
Handle RAND_MAX < 2^32 in get_random_gint64()

MacOSX, for example, sets RAND_MAX at 65535, which rather limits the
size of random gint64s on that platform.

Fixing this revealed some odd behavior in creating random interest rates,
so created a specific function for that with a somewhat more reasonable
approach.

Modified: gnucash/trunk/src/engine/test-core/test-engine-stuff.c
===================================================================
--- gnucash/trunk/src/engine/test-core/test-engine-stuff.c	2013-12-05 20:33:59 UTC (rev 23492)
+++ gnucash/trunk/src/engine/test-core/test-engine-stuff.c	2013-12-05 21:54:18 UTC (rev 23493)
@@ -467,17 +467,23 @@
      * The loop is to "make sure" we get there.  We might
      * want to make this dependent on "deno" in the future.
      */
-    do
-    {
-        numer = get_random_gint64() / 1000000;
-    }
-    while ((numer >> 31) > 0x1FFFF);
+    numer = get_random_gint64 () % (2ULL << 48);
     if (0 == numer) numer = 1;
     /* Make sure we have a non-zero denominator */
     if (0 == deno) deno = 1;
     return gnc_numeric_create(numer, deno);
 }
 
+static gnc_numeric
+get_random_rate (void)
+{
+    /* Large rates blow up xaccSplitAssignToLot, so we clamp the rate
+     * at a smallish value */
+    gint64 numer = get_random_gint64 () % (2ULL << 24);
+    gint64 denom = 100LL;
+    return gnc_numeric_create (numer, denom);
+}
+
 /* ================================================================= */
 /* Commodity stuff */
 
@@ -1315,7 +1321,8 @@
                                                xaccSplitGetAccount(ret)));
         do
         {
-            rate = gnc_numeric_abs(get_random_gnc_numeric());
+            /* Large rates blow up xaccSplitAssignLot */
+            rate = get_random_rate ();
             amt = gnc_numeric_mul(val, rate,
                                   GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
             amt = gnc_numeric_convert(amt, denom, GNC_HOW_RND_ROUND_HALF_UP);

Modified: gnucash/trunk/src/test-core/test-stuff.c
===================================================================
--- gnucash/trunk/src/test-core/test-stuff.c	2013-12-05 20:33:59 UTC (rev 23492)
+++ gnucash/trunk/src/test-core/test-stuff.c	2013-12-05 21:54:18 UTC (rev 23493)
@@ -313,14 +313,40 @@
     return get_random_string_without (NULL);
 }
 
+gint32
+get_random_gint32 (void)
+{
+    gint32 ret = 0;
+
+    if (RAND_MAX > (1 << 15))
+	return rand ();
+
+    if (RAND_MAX > (1 << 7))
+    {
+	ret = rand ();
+	ret <<= 16;
+	ret += rand ();
+	return ret;
+    }
+
+    ret = rand ();
+    ret <<= 8;
+    ret += rand ();
+    ret <<= 8;
+    ret += rand ();
+    ret <<= 8;
+    ret += rand ();
+    return ret;
+}
+
 gint64
 get_random_gint64(void)
 {
     gint64 ret = 0;
 
-    ret = rand();
+    ret = get_random_gint32 ();
     ret <<= 32;
-    ret += rand();
+    ret += get_random_gint32 ();
 
     return ret;
 }

Modified: gnucash/trunk/src/test-core/test-stuff.h
===================================================================
--- gnucash/trunk/src/test-core/test-stuff.h	2013-12-05 20:33:59 UTC (rev 23492)
+++ gnucash/trunk/src/test-core/test-stuff.h	2013-12-05 21:54:18 UTC (rev 23493)
@@ -124,6 +124,7 @@
 gchar* get_random_string(void);
 gchar * get_random_string_length_in_range(int minlen, int maxlen);
 gchar* get_random_string_without(const char *exclude_chars);
+gint32 get_random_gint32 (void);
 gint64 get_random_gint64(void);
 double get_random_double(void);
 const char* get_random_string_in_array(const char* str_list[]);



More information about the gnucash-changes mailing list