https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2012-06-08T01:23:19Z
Ruby Issue Tracking System
Ruby master - Bug #6556: ネストした配列の inspect で segv
https://bugs.ruby-lang.org/issues/6556?journal_id=27068
2012-06-08T01:23:19Z
ko1 (Koichi Sasada)
<ul></ul><p>(2012/06/08 0:36), naruse (Yui NARUSE) wrote:</p>
<blockquote>
<p>Issue <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: ネストした配列の inspect で segv (Closed)" href="https://bugs.ruby-lang.org/issues/6556">#6556</a> has been reported by naruse (Yui NARUSE).</p>
<hr>
<p>Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: ネストした配列の inspect で segv (Closed)" href="https://bugs.ruby-lang.org/issues/6556">#6556</a>: ネストした配列の inspect で segv<br>
<a href="https://bugs.ruby-lang.org/issues/6556" class="external">https://bugs.ruby-lang.org/issues/6556</a></p>
<p>Author: naruse (Yui NARUSE)<br>
Status: Open<br>
Priority: Normal<br>
Assignee:<br>
Category:<br>
Target version:<br>
ruby -v: ruby 2.0.0dev (2012-06-06 trunk 35950) [x86_64-freebsd9.0]</p>
<p>./miniruby -e'10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'<br>
で segv します。</p>
<p>% ./miniruby -e'10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'|&less<br>
-e:1: [BUG] Segmentation fault<br>
ruby 2.0.0dev (2012-06-06 trunk 35950) [x86_64-freebsd9.0]</p>
</blockquote>
<p>マシンスタックのオーバーフローなので,もうしょうがない気がしますが...,<br>
マシンスタックの深さを何かでチェックする?</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
Ruby master - Bug #6556: ネストした配列の inspect で segv
https://bugs.ruby-lang.org/issues/6556?journal_id=27078
2012-06-08T05:19:40Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>ko1 (Koichi Sasada) wrote:</p>
<blockquote>
<p>(2012/06/08 0:36), naruse (Yui NARUSE) wrote:</p>
<blockquote>
<p>./miniruby -e'10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'<br>
で segv します。</p>
<p>% ./miniruby -e'10000.times.inject(x=[]){|a,|a<<(b=[]);b};x.inspect'|&less<br>
-e:1: [BUG] Segmentation fault<br>
ruby 2.0.0dev (2012-06-06 trunk 35950) [x86_64-freebsd9.0]</p>
</blockquote>
<p>マシンスタックのオーバーフローなので,もうしょうがない気がしますが...,<br>
マシンスタックの深さを何かでチェックする?</p>
</blockquote>
<p>マシンスタックのオーバーフローでも本来 SEGV をキャッチして SystemStackError 例外があがるはずです。</p>
<p>で、どうも thread_pthread.c の ruby_stack_overflowed_p での stack overflow 判定に<br>
失敗しているのが理由のようです。もっと特定すると、<br>
if (addr > (void *)((char *)base - size) && addr <= base) return 1;<br>
の base - size がちょっと大きいのが理由で、要するに size が小さすぎます。</p>
<p>理由は、メインスレッドのスタックサイズは ruby_init_stack() が由来なのですが、<br>
最後で、以下の通りあらかじめ size を減らしているため、その誤差で取りこぼしているようです。<br>
space = size > 5 * 1024 * 1024 ? 1024 * 1024 : size / 5;<br>
native_main_thread.stack_maxsize = size - space;</p>
<p>なので、この誤差を補正するといアプローチの場合、例えば<br>
size = size / (size == native_main_thread.stack_maxsize ? 4 : 5);<br>
あるいは<br>
size /= 4;<br>
とすればよいようです。</p>
Ruby master - Bug #6556: ネストした配列の inspect で segv
https://bugs.ruby-lang.org/issues/6556?journal_id=28016
2012-07-14T13:44:28Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>いろいろいじって直ったようなので閉じます!</p>