From: Nobuyoshi Nakada Date: 2008-11-27T12:57:56+09:00 Subject: [ruby-dev:37209] Re: [Bug:1.9] 1+1+1+...+1 dumps core なかだです。 At Mon, 17 Nov 2008 00:04:12 +0900, Hiro Yoshioka wrote in [ruby-dev:37102]: > 下記は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 `
' なぜとくにチェックもしていないのにSystemStackErrorになっているの か疑問だったのですが、代替スタック上でメソッドを呼び出している際 にスタックチェックしているので、これではすべてのrb_bugが常に SystemStackErrorになってしまいます。 $ .i686-linux/miniruby -e Exception.abort! -e:1: [BUG] Segmentation fault ruby 1.9.0 (2008-11-26 revision 20367) [i686-linux] -- control frame ---------- c:0004 p:---- s:0009 b:0009 l:000008 d:000008 CFUNC :abort! c:0003 p:0015 s:0006 b:0006 l:000005 d:000005 TOP -e:1 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP :17 --------------------------- -e:1:in `abort!': stack level too deep (SystemStackError) from -e:1:in `
' しかも、代替スタックでもさらにオーバーフローしてヒープを壊してい ます。 代替スタックを使うことだけなら極簡単な話で、問題はスタックオーバー フローかどうかをきちんとポータブルに判断する方法です。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦