From: Kenta Murata Date: 2008-02-02T08:42:30+09:00 Subject: [ruby-dev:33565] limited_big_rand で SEGV が発生する可能性 むらたです. random.c で定義されている limited_big_rand 内で, SIZEOF_BDIGITS == 2 のときに Segmentation Fault が発生する可能性があります. メールの最後に修正パッチを添付します. ところで,[ruby-dev:30954] から始まる乱数生成器の仕様の話がとても気になっています. 現状はどのようになっているのでしょう?研究で乱数を良く使用するので, 私も議論に混ぜていただけると大変嬉しいです. -- Kenta Murata OpenPGP FP = FA26 35D7 4F98 3498 0810 E0D5 F213 966F E9EB 0BCC diff --git a/random.c b/random.c index 9bcc3b9..e59a0b2 100644 --- a/random.c +++ b/random.c @@ -386,10 +386,10 @@ limited_big_rand(struct RBignum *limit) RBIGNUM_SET_SIGN(val, 1); #if SIZEOF_BDIGITS == 2 # define BIG_GET32(big,i) (RBIGNUM_DIGITS(big)[(i)*2] | \ - ((i)*2+1 < RBIGNUM_DIGITS(big) ? (RBIGNUM_DIGITS(big)[(i)*2+1] << 16) \ + ((i)*2+1 < RBIGNUM_LEN(big) ? (RBIGNUM_DIGITS(big)[(i)*2+1] << 16) \ : 0)) # define BIG_SET32(big,i,d) ((RBIGNUM_DIGITS(big)[(i)*2] = (d) & 0xffff), \ - ((i)*2+1 < RBIGNUM_DIGITS(big) ? (RBIGNUM_DIGITS(big)[(i)*2+1] = (d) >> 16) \ + ((i)*2+1 < RBIGNUM_LEN(big) ? (RBIGNUM_DIGITS(big)[(i)*2+1] = (d) >> 16) \ : 0)) #else /* SIZEOF_BDIGITS == 4 */