From: Yusuke ENDOH Date: 2008-11-20T02:54:16+09:00 Subject: [ruby-dev:37129] Re: [Bug:1.9] 1+1+1+...+1 dumps core 遠藤です。 2008/11/17 0:04 Hiro Yoshioka : > はじめまして、よしおかと申します。 > > 下記のバグなんですが、スタックオーバーフローで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のお作法を全然わかっていないので、変なコードになっている > とは思いますが、コメントいただけるとうれしいです。 ありがとうございます。面白いですね。 sigaltstack(2) ってどのくらいポータブルなんでしょうか。 Debian の man によると CONFORMING TO SUSv2, SVr4, POSIX.1-2001. らしいですが、windows とかどうなんでしょう。 その辺が大丈夫そうなら、「取り込む」に一票です。 -- Yusuke ENDOH