diff --git a/ChangeLog b/ChangeLog index 91a30e66a..8cbe68fe0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2016-12-30 Werner Lemberg + + [ftfuzzer] Replace `rand' with an xorshift algorithm. + + * src/tools/ftfuzzer/ftfuzzer.cc: Don't include `stdlib.h'. + (Random): Implement and use a 32bit `xorshift' algorithm. + 2016-12-30 Werner Lemberg [ftfuzzer] Restrict number of tested bitmap strikes. diff --git a/src/tools/ftfuzzer/ftfuzzer.cc b/src/tools/ftfuzzer/ftfuzzer.cc index 535be3fea..31834a5f9 100644 --- a/src/tools/ftfuzzer/ftfuzzer.cc +++ b/src/tools/ftfuzzer/ftfuzzer.cc @@ -22,7 +22,6 @@ #include #include -#include #include #include @@ -88,6 +87,8 @@ int t; // total number of values so far int m; // number of selected values so far + uint32_t r; // the current pseudo-random number + Random( int n_, int N_ ) : n( n_ ), @@ -96,10 +97,10 @@ t = 0; m = 0; - // ideally, this should depend on the input file, + // Ideally, this should depend on the input file, // for example, taking the sha256 as input; - // however, this is overkill for fuzzying tests - srand( 12345 ); + // however, this is overkill for fuzzying tests. + r = 12345; } int get() @@ -108,7 +109,14 @@ return -1; Redo: - double U = double(rand()) / RAND_MAX; + // We can't use `rand': different C libraries might provide + // different implementations of this function. As a replacement, + // we use a 32bit version of the `xorshift' algorithm. + r ^= r << 13; + r ^= r >> 17; + r ^= r << 5; + + double U = double( r ) / UINT32_MAX; if ( ( N - t ) * U >= ( n - m ) ) {