summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-08-25 09:31:46 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-08-25 09:31:46 +0000
commitfd1022c065509846dd234914e3c9b725d20e928a (patch)
treeb9db58a6b8d6a0567a4daff22e538d77dfbc0e88
parentae6a9009dcb5e475ef51a3448a613e7f4428855d (diff)
* random.c (rb_random_real): check the range of result.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29094 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--random.c14
-rw-r--r--test/ruby/test_array.rb13
3 files changed, 28 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index dcddf95751..641a0fad32 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,6 @@
-Wed Aug 25 17:59:50 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Aug 25 18:31:17 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (rb_random_real): check the range of result.
* array.c (rb_ary_{shuffle_bang,sample}): use Random class object.
diff --git a/random.c b/random.c
index a822a23792..09dde25bc2 100644
--- a/random.c
+++ b/random.c
@@ -887,7 +887,13 @@ rb_random_int32(VALUE obj)
{
rb_random_t *rnd = try_get_rnd(obj);
if (!rnd) {
- VALUE lim = ULONG2NUM(0xffffffff);
+#if SIZEOF_LONG > 32
+ VALUE lim = ULONG2NUM(0x100000000);
+#elif defined HAVE_LONG_LONG
+ VALUE lim = ULL2NUM((LONG_LONG)0xffffffff+1);
+#else
+ VALUE lim = rb_big_plus(ULONG2NUM(0xffffffff), INT2FIX(1));
+#endif
return NUM2ULONG(rb_funcall2(obj, id_rand, 1, &lim));
}
return genrand_int32(&rnd->mt);
@@ -899,7 +905,11 @@ rb_random_real(VALUE obj)
rb_random_t *rnd = try_get_rnd(obj);
if (!rnd) {
VALUE v = rb_funcall2(obj, id_rand, 0, 0);
- return NUM2DBL(v);
+ double d = NUM2DBL(v);
+ if (d < 0.0 || d >= 1.0) {
+ rb_raise(rb_eRangeError, "random number too big %g", d);
+ }
+ return d;
}
return genrand_real(&rnd->mt);
}
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index f95d8870a1..4a8b700c77 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -1899,6 +1899,19 @@ class TestArray < Test::Unit::TestCase
end
end
+ def test_shuffle_random
+ cc = nil
+ gen = proc do
+ 10000000
+ end
+ class << gen
+ alias rand call
+ end
+ assert_raise(RangeError) {
+ [*0..2].shuffle(random: gen)
+ }
+ end
+
def test_sample
100.times do
assert([0, 1, 2].include?([2, 1, 0].sample))