https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2008-12-29T15:59:22Z
Ruby Issue Tracking System
Ruby master - Bug #943: Segmentation fault (cygwin)
https://bugs.ruby-lang.org/issues/943?journal_id=2411
2008-12-29T15:59:22Z
yugui (Yuki Sonoda)
yugui@yugui.jp
<ul><li><strong>Target version</strong> set to <i>1.9.1 Release Candidate</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #943: Segmentation fault (cygwin)
https://bugs.ruby-lang.org/issues/943?journal_id=2412
2008-12-29T16:18:56Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p>Martin Du"rst wrote::</p>
<blockquote>
<p>次のスクリプトが Segmentation fault (core dumped) で終わります。</p>
<p>ruby -e 'puts "A=["; 0.upto(1000000) { puts " [22, 55]," }; puts "]"' | ruby</p>
<p><a href="https://blade.ruby-lang.org/ruby-dev/37611">[ruby-dev:37611]</a> で報告した問題を簡単化しました。問題は左側の ruby のではなく、<br>
右側の ruby で起こります。</p>
</blockquote>
<p> スタックオーバーフローチェックが足りていませんでした.多分,これで直り<br>
ます.手元では直りました.<a href="https://blade.ruby-lang.org/ruby-dev/37611">[ruby-dev:37611]</a> のほうは試していないのです<br>
が,見てもらえませんか.</p>
<a name="Index-vmc"></a>
<h1 >Index: vm.c<a href="#Index-vmc" class="wiki-anchor">¶</a></h1>
<p>--- vm.c (リビジョン 21150)<br>
+++ vm.c (作業コピー)<br>
@@ -77,6 +77,8 @@ vm_set_top_stack(rb_thread_t * th, VALUE<br>
vm_push_frame(th, iseq, VM_FRAME_MAGIC_TOP,<br>
th->top_self, 0, iseq->iseq_encoded,<br>
th->cfp->sp, 0, iseq->local_size);<br>
+</p>
<ul>
<li>
<pre><code> CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max);
</code></pre>
</li>
</ul>
<p>}</p>
<p>static void<br>
@@ -95,6 +97,8 @@ vm_set_eval_stack(rb_thread_t * th, VALU<br>
if (cref) {<br>
th->cfp->dfp[-1] = (VALUE)cref;<br>
}<br>
+</p>
<ul>
<li>CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max);<br>
}</li>
</ul>
<p>static void<br>
@@ -116,6 +120,8 @@ vm_set_main_stack(rb_thread_t *th, VALUE<br>
if (bind && iseq->local_size > 0) {<br>
bind->env = vm_make_env_object(th, th->cfp);<br>
}<br>
+</p>
<ul>
<li>CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max);<br>
}</li>
</ul>
<p>rb_control_frame_t *</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Bug #943: Segmentation fault (cygwin)
https://bugs.ruby-lang.org/issues/943?journal_id=2417
2008-12-29T16:47:06Z
ko1 (Koichi Sasada)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
Applied in changeset r21163.<br>
=end</p>
Ruby master - Bug #943: Segmentation fault (cygwin)
https://bugs.ruby-lang.org/issues/943?journal_id=2419
2008-12-29T17:07:59Z
duerst (Martin Dürst)
duerst@it.aoyama.ac.jp
<ul></ul><p>=begin<br>
笹田さん、こんにちは。</p>
<p>At 16:18 08/12/29, SASADA Koichi wrote:</p>
<blockquote>
<p> ささだです.</p>
<p>Martin Du"rst wrote::</p>
<blockquote>
<p>次のスクリプトが Segmentation fault (core dumped) で終わります。</p>
<p>ruby -e 'puts "A=["; 0.upto(1000000) { puts " [22, 55]," }; puts "]"' | ruby</p>
<p><a href="https://blade.ruby-lang.org/ruby-dev/37611">[ruby-dev:37611]</a> で報告した問題を簡単化しました。問題は左側の ruby のではなく、<br>
右側の ruby で起こります。</p>
</blockquote>
<p> スタックオーバーフローチェックが足りていませんでした.多分,これで直り<br>
ます.手元では直りました.<a href="https://blade.ruby-lang.org/ruby-dev/37611">[ruby-dev:37611]</a> のほうは試していないのです<br>
が,見てもらえませんか.</p>
</blockquote>
<p>以下の修正で上記の問題も <a href="https://blade.ruby-lang.org/ruby-dev/37611">[ruby-dev:37611]</a> も直っています。<br>
というのは、Segmentation fault から SystemStackError に<br>
変わっただけです。その方がいいですので、是非下記のパッチを<br>
コミットしてください。</p>
<p>しかし、真っ平らなデータを読み込むだけでスタックがこんなに伸びる<br>
のはなぜでしょうか。上記のスクリプトを</p>
<p>ruby -e 'puts "A=[]"; 0.upto(1000000) { puts "A<<[22, 55]" }' | ruby</p>
<p>に直すと、時間がかかるものの、問題なく完成されます。</p>
<p>よろしくお願いします。 Martin.</p>
<blockquote>
<a name="Index-vmc"></a>
<h1 >Index: vm.c<a href="#Index-vmc" class="wiki-anchor">¶</a></h1>
<p>--- vm.c (リビジョン 21150)<br>
+++ vm.c (作業コピー)<br>
@@ -77,6 +77,8 @@ vm_set_top_stack(rb_thread_t * th, VALUE<br>
vm_push_frame(th, iseq, VM_FRAME_MAGIC_TOP,<br>
th->top_self, 0, iseq->iseq_encoded,<br>
th->cfp->sp, 0, iseq->local_size);<br>
+</p>
<ul>
<li>
<pre><code> CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max);
</code></pre>
</li>
</ul>
<p>}</p>
<p>static void<br>
@@ -95,6 +97,8 @@ vm_set_eval_stack(rb_thread_t * th, VALU<br>
if (cref) {<br>
th->cfp->dfp[-1] = (VALUE)cref;<br>
}<br>
+</p>
<ul>
<li>CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max);<br>
}</li>
</ul>
<p>static void<br>
@@ -116,6 +120,8 @@ vm_set_main_stack(rb_thread_t *th, VALUE<br>
if (bind && iseq->local_size > 0) {<br>
bind->env = vm_make_env_object(th, th->cfp);<br>
}<br>
+</p>
<ul>
<li>CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max);<br>
}</li>
</ul>
<p>rb_control_frame_t *</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
</blockquote>
<p>#-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University<br>
#-#-# <a href="http://www.sw.it.aoyama.ac.jp" class="external">http://www.sw.it.aoyama.ac.jp</a> <a href="mailto:duerst@it.aoyama.ac.jp" class="email">mailto:duerst@it.aoyama.ac.jp</a></p>
<p>=end</p>
Ruby master - Bug #943: Segmentation fault (cygwin)
https://bugs.ruby-lang.org/issues/943?journal_id=2422
2008-12-29T17:20:11Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p>Martin Duerst wrote::</p>
<blockquote>
<p>以下の修正で上記の問題も <a href="https://blade.ruby-lang.org/ruby-dev/37611">[ruby-dev:37611]</a> も直っています。<br>
というのは、Segmentation fault から SystemStackError に<br>
変わっただけです。その方がいいですので、是非下記のパッチを<br>
コミットしてください。</p>
<p>しかし、真っ平らなデータを読み込むだけでスタックがこんなに伸びる<br>
のはなぜでしょうか。上記のスクリプトを</p>
<p>ruby -e 'puts "A=[]"; 0.upto(1000000) { puts "A<<[22, 55]" }' | ruby</p>
<p>に直すと、時間がかかるものの、問題なく完成されます。</p>
</blockquote>
<p> [e1, e2, ..., eN] というリテラルは,一度 e1, e2, ..., eN を全部スタッ<br>
クに積んで,スタック上の値を利用して配列を作ります.そのため,スタック<br>
オーバーフローになります.</p>
<p> 上記例のように,空の配列を作って,それに push するように変更することも<br>
可能ですが,それを出来るようにしたほうがいいですかねぇ.するにしても,<br>
1.9.2 で命令追加ってことになると思いますが.そう変更したら,ちょっと速度<br>
が遅くなるってくらいかなぁ.</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Bug #943: Segmentation fault (cygwin)
https://bugs.ruby-lang.org/issues/943?journal_id=2450
2008-12-30T15:59:17Z
duerst (Martin Dürst)
duerst@it.aoyama.ac.jp
<ul></ul><p>=begin<br>
At 17:19 08/12/29, SASADA Koichi wrote:</p>
<blockquote>
<p> ささだです.</p>
<p>Martin Duerst wrote::</p>
</blockquote>
<blockquote>
<blockquote>
<p>しかし、真っ平らなデータを読み込むだけでスタックがこんなに伸びる<br>
のはなぜでしょうか。上記のスクリプトを</p>
<p>ruby -e 'puts "A=[]"; 0.upto(1000000) { puts "A<<[22, 55]" }' | ruby</p>
<p>に直すと、時間がかかるものの、問題なく完成されます。</p>
</blockquote>
<p> [e1, e2, ..., eN] というリテラルは,一度 e1, e2, ..., eN を全部スタッ<br>
クに積んで,スタック上の値を利用して配列を作ります.そのため,スタック<br>
オーバーフローになります.</p>
</blockquote>
<p>そのぐらいは想像が付きました。</p>
<blockquote>
<p> 上記例のように,空の配列を作って,それに push するように変更することも<br>
可能ですが,それを出来るようにしたほうがいいですかねぇ.するにしても,<br>
1.9.2 で命令追加ってことになると思いますが.そう変更したら,ちょっと速度<br>
が遅くなるってくらいかなぁ.</p>
</blockquote>
<p>こんなにでかい「定数」の配列はどのぐらい必要になるのかは分かりませんが、<br>
「定数から追加に記述を変更してください。」と言う必要がでてくるのは<br>
何となく逆のような気がする。まあ、1.9.2 とかの段階でじっくり考えた<br>
方がいいと思います。</p>
<p>よろしくお願いします。 Martin.</p>
<p>#-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University<br>
#-#-# <a href="http://www.sw.it.aoyama.ac.jp" class="external">http://www.sw.it.aoyama.ac.jp</a> <a href="mailto:duerst@it.aoyama.ac.jp" class="email">mailto:duerst@it.aoyama.ac.jp</a></p>
<p>=end</p>