eval "use $module" in Perl_call_sv() could segmentation faults

Data::Utilのmethod modifiersが落ちる件は,Perlコアのバグであるようだ*1perlPerl_call_sv()でサブルーチンを呼び出すときに,そのサブルーチンがディレクティブを含んだeval()を実行し,そのuseディレクティブが例外を放出すると*2,setjmp(3)がSEGVを起こしたり黙って落ちたりするようだ。
この問題はPerl_call_sv()を使っているXSコードで起きやすいが,以下のコードで示すようにPure Perlでも発現する可能性がある。

再現コード:

#!perl -w
use strict;
use Test::More tests => 3;
{
    package T;
    use Tie::Hash();
    use base qw(Tie::StdHash);

    sub FETCH{
        my($self, $key) = @_;
        # XXX: "require $key" is okey
        eval "use $key(); 1";
    }
}

tie my(%t), 'T';

ok $t{Cwd}, 'existing module';
ok!$t{'No::Such::Module'}, 'non-existing module';
ok $t{strict}, 'existing module';
__END__

この件はperlbug(1)で報告した:
http://rt.perl.org/rt3/Public/Bug/Display.html?id=69939

*1:5.6.2, 5.8.1, 5.10.1および少し前のbleadperlなどで落ちることを確認した。必ずしもSEGVするとは限らないが,いずれのperlでも異常終了は起きる

*2:たとえばモジュールが存在しない,など