Bug #699
closedremoving Exception#initialize dumps core
Description
=begin
遠藤です。
以下で SEGV しますが、仕様でしょうか。
$ ./ruby -e 'class Exception; remove_method(:initialize); end; raise'
-e:1: warning: removing `initialize' may cause serious problem
セグメンテーション違反です
--
Yusuke ENDOH mame@tsg.ne.jp
=end
Updated by matz (Yukihiro Matsumoto) over 15 years ago
=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
Updated by mame (Yusuke Endoh) over 15 years ago
=begin
遠藤です。
2008/10/31 14:02 Yukihiro Matsumoto matz@ruby-lang.org:
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を内部で例外を発生するものに置き換えたり
すれば同じことが起きます。このことから考えるとあんまり直す必要はなさそうに思います。む
しろ、(コストのことを考えなければ)無限再帰チェックを厳しくす
る方が有効かと。
この件に関しては「直す必要がない」という判断もいいと思います。
でもそれなら文章化した方がいいと思います。
とりあえず redmine に WontFix というエントリを作っておきました。
http://redmine.ruby-lang.org/wiki/ruby-19/WontFix
--
Yusuke ENDOH mame@tsg.ne.jp
=end
Updated by matz (Yukihiro Matsumoto) over 15 years ago
- Status changed from Open to Closed
=begin
これについては修正しないことにします
=end
Updated by nobu (Nobuyoshi Nakada) over 15 years ago
=begin
なかだです。
At Fri, 21 Nov 2008 16:02:12 +0900,
Hiro Yoshioka wrote in [ruby-dev:37134]:
rb_warn() でどうにかリカバリを試みているようですが、あきらめちゃうというのは
だめなんでしょうか?
あきらめちゃうことには反対しませんが、rb_bug()はダメでしょう。
rb_bug()はruby自身が修正対象となるバグということです。ユーザスク
リプトに対して発生してはいけません。rb_raise()を使うべきでしょう。
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end