Forum: Ruby-dev [ruby-trunk - Bug #7903][Open] Array#sampleの引数に渡した乱数生成オブジェクトが負の数を返した場合のエラーメッセージの修正

Posted by sho-h (Sho Hashimoto) (Guest)
on 2013-02-21 14:27
(Received via mailing list)
Issue #7903 has been reported by sho-h (Sho Hashimoto).

----------------------------------------
Bug #7903: Array#sampleの引数に渡した乱数生成オブジェクトが負の数を返した場合のエラーメッセージの修正
https://bugs.ruby-lang.org/issues/7903

Author: sho-h (Sho Hashimoto)
Status: Open
Priority: Low
Assignee:
Category:
Target version:
ruby -v: ruby 2.0.0dev (2013-02-21 trunk 39359) [x86_64-linux]


=begin
Array#sample に渡す乱数生成オブジェクトが負の数を返す場合、必ず「random number too big」というメッセージの 
RangeError が発生するようです。

  gen = proc { -1 }
  class << gen
    alias rand call
  end
  [2,4,6,8,10].sample(random: gen) # => test.rb:5:in `sample': random 
number too big -1 (RangeError)

RAND_UPTO が呼び出している rb_random_ulong_limited の以下の処理がいずれも unsigned long 
のため、必ず「too big」になるのではないかと思いました。上記の例だと r に -1 を指定、limit に 4 
が指定されると想像しています。

  unsigned long r = NUM2ULONG(v);
  if (r > limit) {
      rb_raise(rb_eRangeError, "random number too big %ld", r);
  }

rb_random_real 側ではチェックされているため、わかってる事なのかもしれませんが、念のためチケットを発行してみました。

パッチも作りましたが、適用される場合も NUM2LONG(v)してる行は修正していただいた方がよさそうです。
=end
Posted by ko1 (Koichi Sasada) (Guest)
on 2013-02-22 00:47
(Received via mailing list)
Issue #7903 has been updated by ko1 (Koichi Sasada).

Category set to core
Assignee set to nobu (Nobuyoshi Nakada)
Target version set to 2.1.0


----------------------------------------
Bug #7903: Array#sampleの引数に渡した乱数生成オブジェクトが負の数を返した場合のエラーメッセージの修正
https://bugs.ruby-lang.org/issues/7903#change-36724

Author: sho-h (Sho Hashimoto)
Status: Open
Priority: Low
Assignee: nobu (Nobuyoshi Nakada)
Category: core
Target version: 2.1.0
ruby -v: ruby 2.0.0dev (2013-02-21 trunk 39359) [x86_64-linux]


=begin
Array#sample に渡す乱数生成オブジェクトが負の数を返す場合、必ず「random number too big」というメッセージの 
RangeError が発生するようです。

  gen = proc { -1 }
  class << gen
    alias rand call
  end
  [2,4,6,8,10].sample(random: gen) # => test.rb:5:in `sample': random 
number too big -1 (RangeError)

RAND_UPTO が呼び出している rb_random_ulong_limited の以下の処理がいずれも unsigned long 
のため、必ず「too big」になるのではないかと思いました。上記の例だと r に -1 を指定、limit に 4 
が指定されると想像しています。

  unsigned long r = NUM2ULONG(v);
  if (r > limit) {
      rb_raise(rb_eRangeError, "random number too big %ld", r);
  }

rb_random_real 側ではチェックされているため、わかってる事なのかもしれませんが、念のためチケットを発行してみました。

パッチも作りましたが、適用される場合も NUM2LONG(v)してる行は修正していただいた方がよさそうです。
=end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.