svn commit: r357246 - head/tests/sys/sys

Conrad Meyer cem at FreeBSD.org
Wed Jan 29 05:25:20 UTC 2020


Author: cem
Date: Wed Jan 29 05:25:20 2020
New Revision: 357246
URL: https://svnweb.freebsd.org/changeset/base/357246

Log:
  qmath(3) test: Replace overcomplicated abomination with arc4random(3)
  
  The horrific GENRAND construction bent over backwards to construct 64-bit
  signed integers from the 31-bit output of random(3) for about 20 numbers per
  test.  Reproducibility wasn't a goal: random(3) was seeded with
  srandomdev(3).  Speed is not a factor for generating 20 integers with
  arc4random(3).  Range is not a factor: all uses did not bound the range
  beyond that of the full [INT64_MIN, INT64_MAX].  Just use arc4random(3).
  
  Reported by:	Coverity
  CIDs:		1404809, 1404817, 1404838, 1404840 and about 6x other
  		identical reports of dubious code relating to the
  		construction

Modified:
  head/tests/sys/sys/qmath_test.c

Modified: head/tests/sys/sys/qmath_test.c
==============================================================================
--- head/tests/sys/sys/qmath_test.c	Wed Jan 29 04:42:46 2020	(r357245)
+++ head/tests/sys/sys/qmath_test.c	Wed Jan 29 05:25:20 2020	(r357246)
@@ -47,25 +47,7 @@
 #define	QTEST_QITRUNC(q, iv) ((iv) >> Q_RPSHFT(q))
 #define	QTEST_FFACTOR 32.0
 
-#define	bitsperrand 31
-#define	GENRAND(a, lb, ub)						\
-({									\
-	int _rembits;							\
-	do {								\
-		_rembits = Q_BITSPERBASEUP(ub) + Q_LTZ(lb);		\
-		*(a) = (__typeof(*(a)))0;				\
-		while (_rembits > 0) {					\
-			*(a) |= (((uint64_t)random()) &			\
-			    ((1ULL << (_rembits > bitsperrand ?		\
-			    bitsperrand : _rembits)) - 1));		\
-			*(a) <<= (_rembits - (_rembits > bitsperrand ?	\
-			    bitsperrand : _rembits));			\
-			_rembits -= bitsperrand;			\
-		}							\
-		*(a) += lb;						\
-	} while (*(a) < (lb) || (uint64_t)*(a) > (ub));			\
-	*(a);								\
-})
+#define	GENRAND(a)	arc4random_buf((a), sizeof(*(a)))
 
 /*
  * Smoke tests for basic qmath operations, such as initialization
@@ -213,11 +195,9 @@ ATF_TC_BODY(qmulq_s64q, tc)
 #endif
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10;) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 
 		/*
 		 * XXX: We cheat a bit, to stand any chance of multiplying
@@ -278,12 +258,9 @@ ATF_TC_BODY(qdivq_s64q, tc)
 	if (atf_tc_get_config_var_as_bool_wd(tc, "ci", false))
 		atf_tc_skip("https://bugs.freebsd.org/240219");
 
-
-	srandomdev();
-
 	for (int i = 0; i < 10; i++) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.
@@ -324,11 +301,9 @@ ATF_TC_BODY(qaddq_s64q, tc)
 	double a_dbl, b_dbl, r_dbl, maxe_dbl, delta_dbl;
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10;) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.
@@ -372,11 +347,9 @@ ATF_TC_BODY(qsubq_s64q, tc)
 	double a_dbl, b_dbl, r_dbl, maxe_dbl, delta_dbl;
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10; i++) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.
@@ -418,11 +391,9 @@ ATF_TC_BODY(qfraci_s64q, tc)
 	int64_t a_int, b_int;
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10;) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.
@@ -465,11 +436,9 @@ ATF_TC_BODY(qmuli_s64q, tc)
 	int64_t a_int, b_int;
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10;) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.
@@ -512,11 +481,9 @@ ATF_TC_BODY(qaddi_s64q, tc)
 	int64_t a_int, b_int;
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10;) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.
@@ -563,11 +530,9 @@ ATF_TC_BODY(qsubi_s64q, tc)
 	int64_t a_int, b_int;
 	int error;
 
-	srandomdev();
-
 	for (int i = 0; i < 10; i++) {
-		GENRAND(&a_s64q, INT64_MIN, UINT64_MAX);
-		GENRAND(&b_s64q, INT64_MIN, UINT64_MAX);
+		GENRAND(&a_s64q);
+		GENRAND(&b_s64q);
 		/*
 		 * XXXLAS: Until Qmath handles precision normalisation, only
 		 * test with equal precision.


More information about the svn-src-all mailing list