From: Martin Duerst Date: 2008-12-29T17:07:21+09:00 Subject: [ruby-dev:37650] Re: [Bug #943] Segmentation fault (cygwin) 笹田さん、こんにちは。 At 16:18 08/12/29, SASADA Koichi wrote: > ささだです. > >Martin Du"rst wrote:: >> 次のスクリプトが Segmentation fault (core dumped) で終わります。 >> >> ruby -e 'puts "A=["; 0.upto(1000000) { puts " [22, 55]," }; puts "]"' | ruby >> >> [ruby-dev:37611] で報告した問題を簡単化しました。問題は左側の ruby のではなく、 >> 右側の ruby で起こります。 > > スタックオーバーフローチェックが足りていませんでした.多分,これで直り >ます.手元では直りました.[ruby-dev:37611] のほうは試していないのです >が,見てもらえませんか. 以下の修正で上記の問題も [ruby-dev:37611] も直っています。 というのは、Segmentation fault から SystemStackError に 変わっただけです。その方がいいですので、是非下記のパッチを コミットしてください。 しかし、真っ平らなデータを読み込むだけでスタックがこんなに伸びる のはなぜでしょうか。上記のスクリプトを ruby -e 'puts "A=[]"; 0.upto(1000000) { puts "A<<[22, 55]" }' | ruby に直すと、時間がかかるものの、問題なく完成されます。 よろしくお願いします。 Martin. >Index: vm.c >=================================================================== >--- vm.c (リビジョン 21150) >+++ vm.c (作業コピー) >@@ -77,6 +77,8 @@ vm_set_top_stack(rb_thread_t * th, VALUE > vm_push_frame(th, iseq, VM_FRAME_MAGIC_TOP, > th->top_self, 0, iseq->iseq_encoded, > th->cfp->sp, 0, iseq->local_size); >+ >+ CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max); > } > > static void >@@ -95,6 +97,8 @@ vm_set_eval_stack(rb_thread_t * th, VALU > if (cref) { > th->cfp->dfp[-1] = (VALUE)cref; > } >+ >+ CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max); > } > > static void >@@ -116,6 +120,8 @@ vm_set_main_stack(rb_thread_t *th, VALUE > if (bind && iseq->local_size > 0) { > bind->env = vm_make_env_object(th, th->cfp); > } >+ >+ CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max); > } > > rb_control_frame_t * > > >-- >// SASADA Koichi at atdot dot net #-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University #-#-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp