From: Yukihiro Matsumoto Date: 2008-10-31T14:02:46+09:00 Subject: [ruby-dev:37005] Re: [Bug:1.9] removing Exception#initialize dumps core まつもと ゆきひろです 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" 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を内部で例外を発生するものに置き換えたり すれば同じことが起きます。 このことから考えるとあんまり直す必要はなさそうに思います。む しろ、(コストのことを考えなければ)無限再帰チェックを厳しくす る方が有効かと。 まつもと ゆきひろ /:|)