https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112019-08-25T20:36:40ZRuby Issue Tracking SystemRuby master - Bug #13970: Base64 urlsafe_decode64 unsafe use of tr.https://redmine.ruby-lang.org/issues/13970?journal_id=809972019-08-25T20:36:40Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>I don't think this is a bug. Most pure Ruby code assumes and does not check that method arguments respond to all methods that the code expects them to respond to. It's generally considered a smell to take code like:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">bar</span><span class="p">,</span> <span class="n">baz</span><span class="p">)</span>
<span class="n">bar</span><span class="p">.</span><span class="nf">x</span> <span class="o">+</span> <span class="n">baz</span><span class="p">.</span><span class="nf">y</span>
<span class="k">end</span>
</code></pre>
<p>and change it to:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">bar</span><span class="p">,</span> <span class="n">baz</span><span class="p">)</span>
<span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">,</span> <span class="s2">"bar does not respond to x"</span> <span class="k">unless</span> <span class="n">bar</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="ss">:x</span><span class="p">)</span>
<span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">,</span> <span class="s2">"baz does not respond to y"</span> <span class="k">unless</span> <span class="n">baz</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="ss">:y</span><span class="p">)</span>
<span class="n">bar</span><span class="p">.</span><span class="nf">x</span> <span class="o">+</span> <span class="n">baz</span><span class="p">.</span><span class="nf">y</span>
<span class="k">end</span>
</code></pre>
<p>Especially if <code>bar</code> or <code>baz</code> could be instances of subclasses of BasicObject and not Object with the <code>x</code> and <code>y</code> methods defined, respectively.</p>