diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-08-25 09:31:46 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-08-25 09:31:46 +0000 |
commit | fd1022c065509846dd234914e3c9b725d20e928a (patch) | |
tree | b9db58a6b8d6a0567a4daff22e538d77dfbc0e88 /random.c | |
parent | ae6a9009dcb5e475ef51a3448a613e7f4428855d (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
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -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); } |