java.Random.nextInt(int) has a typo that makes it return negative in some (apparantly rare) cases. To get the next random number, it calls the protected method java.Random.next(int) with the parameter 32, but it should be 31 (both to be correct and according to the specification at http://java.sun.com/j2se/1.4.1/docs/api/java/util/Random.html#nextInt(int). (Moreover, even if you are lucky and never exploit the bug, it does not yield the same sequence of random numbers for a given seed as Sun's implementation.) Release: gcc 3.2 (or CVS from 2002-11-06) Environment: The bug is independent of envionment. How-To-Repeat: The attached file exploits the bug and prints: i=867384, x=-222
Fix: Here's a patch against a recent CVS: Index: libjava/java/util/Random.java =================================================================== RCS file: /cvsroot/gcc/gcc/libjava/java/util/Random.java,v retrieving revision 1.7 diff -u -r1.7 Random.java --- libjava/java/util/Random.java 18 Jun 2002 15:40:00 -0000 1.7 +++ libjava/java/util/Random.java 6 Nov 2002 16:55:16 -0000 @@ -296,7 +296,7 @@ int bits, val; do { - bits = next(32); + bits = next(31); val = bits % n; } while (bits - val + (n - 1) < 0);
Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-Why: I'm handling this
State-Changed-From-To: open->closed State-Changed-Why: Thanks for the report and the patch. I'm checking in your fix on the trunk. I'm also putting it into Classpath. I've added your test to Mauve.
From: tromey@gcc.gnu.org To: gcc-gnats@gcc.gnu.org Cc: Subject: libgcj/8481 Date: 7 Nov 2002 04:38:21 -0000 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2002-11-06 20:38:21 Modified files: libjava : ChangeLog libjava/java/util: Random.java Log message: From svens@it.uu.se. For PR libgcj/8481. * java/util/Random.java (nextInt(int)): Only use 31 bits. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&r1=1.1508&r2=1.1509 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/util/Random.java.diff?cvsroot=gcc&r1=1.7&r2=1.8