https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2010-05-26T06:58:27Z
Ruby Issue Tracking System
Ruby master - Bug #3341: Random#randにTimeのRangeを渡すとSEGVする
https://redmine.ruby-lang.org/issues/3341?journal_id=11241
2010-05-26T06:58:27Z
znz (Kazuhiro NISHIYAMA)
<ul></ul><p>=begin<br>
range.end - range.begin が Float なら落ちるようで<br>
ruby-trunk -e ';x=Object.new; def x.-(o);1.1;end; Random.new.rand(x..x)'<br>
でも落ちました。</p>
<p>random_rand で</p>
<ul>
<li>v = range_values(vmax, &beg, &excl) が Time.now-Time.now で Float になる</li>
<li>(vがgenrand_real2(&rnd->mt)をかけたものになる)</li>
<li>RFLOAT_VALUE(rb_check_to_float(beg)); で beg が Time なので RFLOAT_VALUE(nil) になって落ちる<br>
という流れのようなので、以下のパッチのように単純に beg + v にした方が<br>
Random.new.rand(Time.at(0)..Time.now)<br>
のような使い方も出来て良いのではないでしょうか?</li>
</ul>
<p>diff --git a/random.c b/random.c<br>
index b2abca7..17cdf49 100644<br>
--- a/random.c<br>
+++ b/random.c<br>
@@ -1074,15 +1074,7 @@ random_rand(int argc, VALUE *argv, VALUE obj)<br>
long x = FIX2LONG(beg) + FIX2LONG(v);<br>
return LONG2NUM(x);<br>
}</p>
<ul>
<li>switch (TYPE(v)) {</li>
<li>
<pre><code> case T_BIGNUM:
</code></pre>
</li>
<li>return rb_big_plus(v, beg);</li>
<li>
<pre><code> case T_FLOAT:
</code></pre>
</li>
<li>RFLOAT_VALUE(v) += RFLOAT_VALUE(rb_check_to_float(beg));</li>
<li>return v;</li>
<li>
<pre><code> default:
</code></pre>
</li>
<li>return rb_funcall2(v, id_plus, 1, &beg);</li>
<li>}</li>
</ul>
<ul>
<li>return rb_funcall2(beg, id_plus, 1, &v);<br>
}</li>
</ul>
<p>/*</p>
<p>=end</p>
Ruby master - Bug #3341: Random#randにTimeのRangeを渡すとSEGVする
https://redmine.ruby-lang.org/issues/3341?journal_id=11242
2010-05-26T08:16:56Z
mrkn (Kenta Murata)
muraken@gmail.com
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>nobu (Nobuyoshi Nakada)</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #3341: Random#randにTimeのRangeを渡すとSEGVする
https://redmine.ruby-lang.org/issues/3341?journal_id=11254
2010-05-26T15:39:14Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>=begin<br>
This issue was solved with changeset r28018.<br>
Ryo, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<p>=end</p>
Ruby master - Bug #3341: Random#randにTimeのRangeを渡すとSEGVする
https://redmine.ruby-lang.org/issues/3341?journal_id=11255
2010-05-26T15:39:50Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Category</strong> set to <i>core</i></li><li><strong>Target version</strong> set to <i>1.9.2</i></li></ul><p>=begin</p>
<p>=end</p>