From: Koichi Sasada Date: 2011-06-11T16:59:27+09:00 Subject: [ruby-dev:43731] [Ruby 1.9 - Bug #4648][Assigned] lambda上のclass定義からのreturnでSEGV Issue #4648 has been updated by Koichi Sasada. Status changed from Open to Assigned Assignee set to Koichi Sasada ---------------------------------------- Bug #4648: lambda上のclass定義からのreturnでSEGV http://redmine.ruby-lang.org/issues/4648 Author: Kazuki Tsujimoto Status: Assigned Priority: Normal Assignee: Koichi Sasada Category: Target version: ruby -v: ruby 1.9.3dev (2011-05-05 trunk 31435) [x86_64-linux] =begin 辻本といいます。 以下のコードでSEGVします。 $ ./miniruby -e '->{class A; return; end}.()' -e:1: [BUG] Segmentation fault returnの処理(vm_throw)は以下のようになっていますが: (1) return先の走査中にclass定義用のフレームにあたったらその外側のフレームのlfpを利用して走査処理を続ける。(Bug #1018) (2) return先の走査中にLAMBDAフレームにあたったら、有効なreturn(lambdaの内側からのreturn)かどうかを調べるために return時点でのcfp->dfpをlfpまで辿っていく。 問題のコードでは、1.によりlfpが書き換えられたことで2.のdfpを辿る処理が終わらないため SEGVするという流れになります。 1.の処理を行なった時点で有効なreturnであることの確認は出来ているので、 その場合は2.を行わずそのままLAMBDAフレームからreturnさせることで回避できます。 パッチを添付します。 =end -- http://redmine.ruby-lang.org