Skip to content

Commit 42edb06

Browse files
committed
Use the libGMP random generator always instead of stdlib random().
LibGMP uses a Mersenne twister which should be a good trade-off between fast and secure.
1 parent 91ea4da commit 42edb06

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

libchecktestdata.cc

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ command currcmd;
4848

4949
gmp_randclass gmp_rnd(gmp_randinit_default);
5050

51+
// Simple function to get a random integer in the range [0,n-1].
52+
// Assumes that the gmp_rnd global variable has been initialized.
53+
unsigned long get_random(unsigned long n)
54+
{
55+
mpz_class x = gmp_rnd.get_z_range(n);
56+
return x.get_ui();
57+
}
58+
5159
databuffer data;
5260
vector<command> program;
5361

@@ -584,16 +592,18 @@ bool dotest(const test& t)
584592
case '!': return !dotest(t.args[0]);
585593
case '&': return dotest(t.args[0]) && dotest(t.args[1]);
586594
case '|': return dotest(t.args[0]) || dotest(t.args[1]);
587-
case 'E': if ( gendata ) {
588-
return (random() % 10 < 3);
589-
} else {
590-
return data.eof();
591-
}
592-
case 'M': if ( gendata ) {
593-
return (random() % 2 == 0);
594-
} else {
595-
return !data.eof() && t.args[0].val.find(data.next())!=string::npos;
596-
}
595+
case 'E':
596+
if ( gendata ) {
597+
return (get_random(10) < 3);
598+
} else {
599+
return data.eof();
600+
}
601+
case 'M':
602+
if ( gendata ) {
603+
return (get_random(2) == 0);
604+
} else {
605+
return !data.eof() && t.args[0].val.find(data.next())!=string::npos;
606+
}
597607
case 'U': return unique(t.args);
598608
case 'A': return inarray(t.args[0],t.args[1]);
599609
case '?': return compare(t);
@@ -676,7 +686,7 @@ int getmult(string &exp, unsigned int &index)
676686
max = 1;
677687
}
678688

679-
return (min + random() % (1 + max - min));
689+
return (min + get_random(1 + max - min));
680690
}
681691

682692
string genregex(string exp)
@@ -700,7 +710,7 @@ string genregex(string exp)
700710
{
701711
int mult = getmult(exp, i);
702712
for (int cnt = 0; cnt < mult; cnt++) {
703-
res += (char) (' ' + (random() % (int) ('~' - ' ')));
713+
res += (char) (' ' + get_random((int) ('~' - ' ')));
704714
}
705715
}
706716
break;
@@ -748,7 +758,7 @@ string genregex(string exp)
748758
}
749759
int mult = getmult(exp, i);
750760
for (int cnt = 0; cnt < mult; cnt++) {
751-
res += possibleVec[random() % possibleVec.size()];
761+
res += possibleVec[get_random(possibleVec.size())];
752762
}
753763
}
754764
break;
@@ -777,7 +787,7 @@ string genregex(string exp)
777787
alternatives.push_back(exp.substr(begin, i - begin));
778788
int mult = getmult(exp, i);
779789
for (int cnt = 0; cnt < mult; cnt++) {
780-
res += genregex(alternatives[random() % alternatives.size()]);
790+
res += genregex(alternatives[get_random(alternatives.size())]);
781791
}
782792
}
783793
break;
@@ -1233,11 +1243,10 @@ void init_checktestdata(std::istream &progstream, int opt_mask)
12331243
for(size_t i=0; i<program.size(); i++) cerr << program[i] << endl;
12341244
}
12351245

1236-
// Initialize random generators
1246+
// Initialize random generator
12371247
struct timespec time;
12381248
clock_gettime(CLOCK_REALTIME,&time);
12391249
mpz_class seed = 1000000000 * mpz_class(time.tv_sec) + time.tv_nsec;
1240-
srandom(seed.get_ui());
12411250
gmp_rnd.seed(seed);
12421251

12431252
// Initialize current position in program.

0 commit comments

Comments
 (0)