Ruby Issue Tracking System: Issueshttps://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112021-06-12T23:59:46ZRuby Issue Tracking System
Redmine Ruby master - Bug #17951 (Closed): Collisions in Proc#hash values for blocks defined at the same ...https://redmine.ruby-lang.org/issues/179512021-06-12T23:59:46Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">require</span> <span class="s1">'set'</span>
<span class="k">def</span> <span class="nf">capture</span><span class="p">(</span><span class="o">&</span><span class="n">block</span><span class="p">)</span>
<span class="n">block</span>
<span class="k">end</span>
<span class="c1"># it creates 1k of same blocks</span>
<span class="n">blocks</span> <span class="o">=</span> <span class="no">Array</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span> <span class="p">{</span> <span class="ss">:foo</span> <span class="p">}</span> <span class="p">}</span>
<span class="n">hashes</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="ss">:hash</span><span class="p">).</span><span class="nf">uniq</span>
<span class="n">ids</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="ss">:object_id</span><span class="p">).</span><span class="nf">uniq</span>
<span class="n">equality</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="n">blocks</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nf">eql?</span><span class="p">(</span><span class="n">_1</span><span class="p">)</span> <span class="p">}.</span><span class="nf">tally</span>
<span class="nb">hash</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">.</span><span class="nf">to_h</span> <span class="p">{</span> <span class="p">[</span><span class="n">_1</span><span class="p">,</span> <span class="kp">nil</span><span class="p">]</span> <span class="p">}</span>
<span class="n">set</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">.</span><span class="nf">to_set</span>
<span class="nb">puts</span><span class="p">(</span><span class="n">hashes</span><span class="p">.</span><span class="nf">size</span><span class="p">)</span> <span class="c1"># => 11</span>
<span class="nb">puts</span><span class="p">(</span><span class="n">ids</span><span class="p">.</span><span class="nf">size</span><span class="p">)</span> <span class="c1"># => 1000</span>
<span class="nb">puts</span><span class="p">(</span><span class="n">equality</span><span class="p">.</span><span class="nf">inspect</span><span class="p">)</span> <span class="c1"># => {true=>1, false=>999}</span>
<span class="nb">puts</span><span class="p">(</span><span class="nb">hash</span><span class="p">.</span><span class="nf">size</span><span class="p">)</span> <span class="c1"># => 1000</span>
<span class="nb">puts</span><span class="p">(</span><span class="n">set</span><span class="p">.</span><span class="nf">size</span><span class="p">)</span> <span class="c1"># => 1000</span>
</code></pre>
<p>The script builds one thousand blocks and then compares them in various ways. I would expect proc objects to be completely opaque and thus be treated as separate objects. As in, they are not equal. All tests but first confirm this expectation. However, <code>Proc#hash</code> doesn't return 1000 different results rather it varies between 3 and 20 on my machine.</p>
<p>As I understand, current behavior doesn't violate ruby's guarantees. But I would expect <code>Proc#hash</code> results to be as unique as <code>Proc#object_id</code>, at least a lot more unique than they currently are.</p>
<p>The problem is likely to occur only for blocks defined at the same line.</p>
<p>ref to similar/related issue <a href="https://bugs.ruby-lang.org/issues/6048" class="external">https://bugs.ruby-lang.org/issues/6048</a></p> Ruby master - Bug #16771 (Closed): Segmentation fault when inspecting a bound methodhttps://redmine.ruby-lang.org/issues/167712020-04-08T22:32:00Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<p>This piece of code leads to a crash in ruby 2.7.1.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">bound_method</span> <span class="o">=</span> <span class="no">Kernel</span><span class="p">.</span><span class="nf">instance_method</span><span class="p">(</span><span class="ss">:respond_to?</span><span class="p">).</span><span class="nf">bind</span><span class="p">(</span><span class="no">Object</span><span class="p">.</span><span class="nf">new</span><span class="p">)</span>
<span class="mi">100000</span><span class="p">.</span><span class="nf">times</span> <span class="p">{</span> <span class="n">bound_method</span><span class="p">.</span><span class="nf">inspect</span> <span class="p">}</span>
</code></pre>
<p>I cannot reproduce the error in 2.7.0 so this must be new.<br>
I attached the output, didn't bother with the crash report log, though. It should be easily reproducible since I found it on CI which runs a different OS.</p> Ruby master - Bug #15536 (Closed): Crash on merging specific hashes using keyword splathttps://redmine.ruby-lang.org/issues/155362019-01-15T08:42:07Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<p>Here's a snippet that leads to a crash on ruby 2.5.3. I tried to make it as small as possible.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="mi">1000</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span>
<span class="p">{</span>
<span class="o">**</span><span class="p">{</span>
<span class="ss">a1: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a2: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a3: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a4: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a5: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a6: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a7: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a8: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a9: </span><span class="kp">nil</span>
<span class="p">},</span>
<span class="ss">b1: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">b2: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a4: </span><span class="kp">nil</span><span class="p">,</span>
<span class="o">**</span><span class="p">{</span> <span class="ss">c1: </span><span class="kp">nil</span><span class="p">,</span> <span class="ss">c2: </span><span class="kp">nil</span> <span class="p">},</span>
<span class="ss">a7: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a8: </span><span class="kp">nil</span><span class="p">,</span>
<span class="ss">a9: </span><span class="kp">nil</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">end</span>
</code></pre>
<p>Results in <code>*** Error in irb': malloc(): memory corruption: 0x000055ca6c832bd0 ***</code> (more detail in the attached file).</p>
<p>We came across this on ruby 2.5.3 and as far as I can tell it's no longer a problem on 2.6 but we yet to upgrade.</p> Ruby master - Bug #13305 (Closed): Occasional segfaults after defining methods while running cove...https://redmine.ruby-lang.org/issues/133052017-03-12T20:08:19Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<p>The problem occurs on MRI 2.4.0 and the latest trunk only (2017-03-13 trunk 57944). After running <code>Coverage.start</code> code defines the same method few times but every time the size of the method increases. Occasionally MRI can fail on attempt to get the coverage result. The bug can be reproduced quite easily with the following two files</p>
<p>a.rb</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">require</span> <span class="s1">'coverage'</span>
<span class="no">Coverage</span><span class="p">.</span><span class="nf">start</span>
<span class="nb">require_relative</span> <span class="s1">'./b'</span>
<span class="n">add_method</span><span class="p">(</span><span class="no">Class</span><span class="p">.</span><span class="nf">new</span><span class="p">)</span>
<span class="no">Coverage</span><span class="p">.</span><span class="nf">result</span>
</code></pre>
<p>b.rb</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">REPEATS</span> <span class="o">=</span> <span class="mi">400</span>
<span class="k">def</span> <span class="nf">add_method</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="no">REPEATS</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span>
<span class="n">target</span><span class="p">.</span><span class="nf">class_eval</span><span class="p">(</span><span class="o"><<~</span><span class="no">RUBY</span><span class="p">,</span> <span class="kp">__FILE__</span><span class="p">,</span> <span class="kp">__LINE__</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="sh">
def foo
</span><span class="si">#{</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">*</span> <span class="nb">rand</span><span class="p">(</span><span class="no">REPEATS</span><span class="p">)</span><span class="si">}</span><span class="sh">
end
1
</span><span class="no"> RUBY</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>Run <code>ruby a.rb</code> to reproduce the bug. Several runs may be required before MRI fails, but for me it fails on almost every run.</p>
<p>Note that passing filename and line number to <code>class_eval</code> is important, so as adding <code>1</code> after the method definition.</p>
<p>The crash report attached to the issue.</p> Ruby master - Bug #13090 (Closed): Cannot use return statement in lambdas using instance_eval (MR...https://redmine.ruby-lang.org/issues/130902016-12-30T14:42:14Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<p>Hello,</p>
<p>I'm pretty sure I've found a bug after running specs for dry-initializer gem on MRI 2.4.<br>
I managed to find the minimal code to reproduce the issue:</p>
<p>MRI 2.3.3</p>
<pre><code>$ ruby -e "instance_eval(&lambda { |_| return })"
$
</code></pre>
<p>MRI 2.4.0-p0</p>
<pre><code>$ ruby -e "instance_eval(&lambda { |_| return })"
-e:1:in `block in <main>': unexpected return (LocalJumpError)
from -e:1:in `instance_eval'
from -e:1:in `<main>'
</code></pre>
<p>I <em>think</em> lambda has been converted to an ordinary proc, but I didn't check it.</p>
<p>Best regards,<br>
Nikita</p> Ruby master - Bug #12164 (Closed): Binding UnboundMethod to BasicObjecthttps://redmine.ruby-lang.org/issues/121642016-03-10T11:22:59Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<p>I tried to bind method from Object to BasicObject and I suddenly succeeded.<br>
For example:</p>
<pre><code>$ irb
2.3.0 :001 > BasicObject.send :define_method, :methods, Object.instance_method(:methods)
=> :methods
2.3.0 :002 > BasicObject.new.methods
=> [:!, :==, :!=, :__send__, :equal?, :methods, :instance_eval, :instance_exec, :__id__]
2.3.0 :003 >
</code></pre>
<p>In earlier ruby versions such code would raise an exception:</p>
<pre><code>$ irb
2.2.4 :001 > BasicObject.send :define_method, :methods, Object.instance_method(:methods)
TypeError: bind argument must be a subclass of Object
from (irb):1:in `define_method'
from (irb):1
from /Users/gordon/.rvm/rubies/ruby-2.2.4/bin/irb:11:in `<main>'
2.2.4 :002 >
</code></pre>
<p>Is it a bug or a feature?<br>
Probably it is somehow related to <a href="https://bugs.ruby-lang.org/issues/11278" class="external">https://bugs.ruby-lang.org/issues/11278</a></p>