=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:36993] [Bug:1.9] removing Exception#initialize dumps core"
on Thu, 30 Oct 2008 02:35:10 +0900, "Yusuke ENDOH" mame@tsg.ne.jp writes:
|以下で SEGV しますが、仕様でしょうか。
|
|$ ./ruby -e 'class Exception; remove_method(:initialize); end; raise'
|-e:1: warning: removing `initialize' may cause serious problem
|セグメンテーション違反です
なにが起きてるかというと
- raiseで例外オブジェクトを作ろうとする
- Exception#initializeが削除されているので
BasicObject#initializeを呼ぶ
- BasicObject#initializeは引数を取らないので引数の数があわ
ずArgumentError が発生する(raiseする)
- raiseで例外オブジェクトを作ろうとする
- 以下繰り返し。無限再帰でスタックを使いきってSEGV
です。BasicObject#initializeを任意個の引数を受け付ける(で、無
視する)ようにすれば、この問題はなくなりますが、たとえば
Exception#initializeを内部で例外を発生するものに置き換えたり
すれば同じことが起きます。
このことから考えるとあんまり直す必要はなさそうに思います。む
しろ、(コストのことを考えなければ)無限再帰チェックを厳しくす
る方が有効かと。
まつもと ゆきひろ /:|)
=end