From: Hiro Yoshioka Date: 2008-11-17T00:04:12+09:00 Subject: [ruby-dev:37102] Re: [Bug:1.9] 1+1+1+...+1 dumps core はじめまして、よしおかと申します。 下記のバグなんですが、スタックオーバーフローでSIGSEGVの場合 リソースを使いきってしまうので、シグナルハンドラが動くリソース すらなくなってしまって落るのではないかと思います。 対処法はBINARY HACKSなどに載っているsigaltstack(2)という代替 スタックを用意してあげれば対処できるのではないかと思います。 いずれにせよ、落ることにはかわりないんですが、どこで落ちて いるかがわかる程度のことはあるかと。 下記はsigaltstack(2)を使って実装した例です。 $ ./ruby -e 'p eval("1+" * 14154 + "1")' -e:1: [BUG] Segmentation fault ruby 1.9.0 (2008-11-01 revision 20086) [i686-linux] -- control frame ---------- c:0004 p:---- s:0011 b:0011 l:000010 d:000010 CFUNC :eval c:0003 p:0018 s:0007 b:0006 l:000005 d:000005 TOP -e:1 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH :inherited c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP :17 --------------------------- -e:1:in `eval': stack level too deep (SystemStackError) from -e:1:in `
' どのように対処したかは日記に記しましたので、ご笑覧ください。 http://d.hatena.ne.jp/hyoshiok/20081116 rubyのお作法を全然わかっていないので、変なコードになっている とは思いますが、コメントいただけるとうれしいです。 よ -- Hiro Yoshioka Miracle Linux Corporation http://blog.miraclelinux.com/yume/ http://d.hatena.ne.jp/hyoshiok/ From: "Yusuke ENDOH" Subject: [ruby-dev:37007] [Bug:1.9] 1+1+1+...+1 dumps core Date: Sat, 1 Nov 2008 00:07:42 +0900 Message-ID: > 遠藤です。 > > 以下で SEGV します。 > > > $ ./ruby -e 'eval("1+" * 100000 + "1")' > セグメンテーション違反です > > > iseq_compile_each の再帰でスタックオーバーフローするためです。 > 再帰数のチェックを入れれば例外にできると思いますが、こんな > ケースのためにコンパイルを遅くするのはもったいない気もします。 > どんなものでしょう。WontFix 行き? > > また、MVM 版だと SystemStackError として検知できるらしいです。 > > > ちなみに、パーサの方でスタックオーバーフローする場合は例外に > なります (bison に依存するかもしれませんが) 。 > > > $ ./ruby -e 'eval("1+(" * 100000 + "1" + ")" * 100000)' > -e:1:in `eval': (eval):1: memory exhausted (SyntaxError) > ...+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1... > ... ^ > from -e:1:in `
' > > -- > Yusuke ENDOH >