On Mon, Dec 07, 2015 at 09:33:47AM +0100, Theo Buehler wrote:
> I think some of these are ok, but I'm unsure about some of the others.
> Here are some of my concerns:
>
> - since arc4random_uniform can potentially loop indefinitely, it
> might interfere with predictable timing of some routines. I can't
> tell if this is harmless in all cases below. This applies in
> particular to the proposed changes in the kernel.
I hadn't considered timing problems. I'll look at it again tonight, but
someone more familiar with the code should certainly look at it before
committing.
> - changing random() to arc4random() in games might have undesired
> side-effects like interfering with the reproducibility of tests or
> games. I think this might apply to awk for the same reason as in the
> shells.
The patch for awk was wrong. Updated patch below. I'll look into hack
tonight when I have more time.
> > Index: lib/libc/stdlib/rand.c
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/stdlib/rand.c,v
> > retrieving revision 1.15
> > diff -u -p -r1.15 rand.c
> > --- lib/libc/stdlib/rand.c 13 Sep 2015 08:31:47 -0000 1.15
> > +++ lib/libc/stdlib/rand.c 7 Dec 2015 06:42:17 -0000
> > @@ -50,7 +50,7 @@ int
> > rand(void)
> > {
> > if (rand_deterministic == 0)
> > - return (arc4random() % ((u_int)RAND_MAX + 1));
> > + return (arc4random_uniform((u_int)RAND_MAX + 1));
> > return (rand_r(&next));
> > }
> >
>
> this is modulo 2^n, so I think this one is fine as it is.
It's safe but takes a bit of thinking. I first had it as
return (arc4random() & RAND_MAX);
which to me is more obviously correct, but since it's safe as is. I have
no strong opinion on this.
> > Index: usr.bin/awk/run.c
> > ===================================================================
>
> Unsure about this one. I think deterministic sequences might be desired
> in some circumstances (this one is deterministic when a seed was given).
theo@ also pointed out that awk can be deterministic. Since RAND_MAX is
1 below a power of 2, & is safe. How about
Index: run.c
===================================================================
RCS file: /cvs/src/usr.bin/awk/run.c,v
retrieving revision 1.39
diff -u -p -r1.39 run.c
--- run.c 5 Sep 2015 22:07:10 -0000 1.39
+++ run.c 7 Dec 2015 19:28:31 -0000
@@ -1581,7 +1581,7 @@ Cell *bltin(Node **a, int n) /* builtin
u = (Awkfloat) system(getsval(x)) / 256; /* 256 is unix-dep */
break;
case FRAND:
- u = (Awkfloat) (random() % RAND_MAX) / RAND_MAX;
+ u = (Awkfloat) (random() & RAND_MAX) / ((u_int)RAND_MAX + 1);
break;
case FSRAND:
if (isrec(x)) { /* no argument provided */