Project

General

Profile

Actions

Bug #699

closed

removing Exception#initialize dumps core

Added by mame (Yusuke Endoh) over 13 years ago. Updated about 11 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
Backport:
[ruby-dev:36993]

Description

=begin
遠藤です。

以下で SEGV しますが、仕様でしょうか。

$ ./ruby -e 'class Exception; remove_method(:initialize); end; raise'
-e:1: warning: removing `initialize' may cause serious problem
セグメンテーション違反です

--
Yusuke ENDOH
=end

Actions #1

Updated by matz (Yukihiro Matsumoto) over 13 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" 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

Actions #2

Updated by mame (Yusuke Endoh) over 13 years ago

=begin
遠藤です。

2008/10/31 14:02 Yukihiro Matsumoto :

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を内部で例外を発生するものに置き換えたり
すれば同じことが起きます。

このことから考えるとあんまり直す必要はなさそうに思います。む
しろ、(コストのことを考えなければ)無限再帰チェックを厳しくす
る方が有効かと。

この件に関しては「直す必要がない」という判断もいいと思います。
でもそれなら文章化した方がいいと思います。

とりあえず redmine に WontFix というエントリを作っておきました。
http://redmine.ruby-lang.org/wiki/ruby-19/WontFix

--
Yusuke ENDOH

=end

Actions #3

Updated by matz (Yukihiro Matsumoto) over 13 years ago

  • Status changed from Open to Closed

=begin
これについては修正しないことにします
=end

Actions #4

Updated by nobu (Nobuyoshi Nakada) over 13 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

Actions

Also available in: Atom PDF