2009年4月18日土曜日

[Perl] 正規表現で Segmentation fault する件

Text::ParseWords に大量の文字を渡したら Segmentation fault で落ちたので、メモ。
use Text::ParseWords;
my $str = 'a' x 100000;
my @array = quotewords( " ", 0, $str );
→ 実行すると Segmentation fault に
Text::ParseWordsのバージョンは
# perl -MText::ParseWords -le 'print $Text::ParseWords::VERSION'
3.22
ですが、ParseWords.pm を見てみると parse_line() の正規表現で落ちているので、
Perl 本体の問題のようです。

ぐぐってみると、以下の記事が。今回の実行環境はPerl 5.8.5 なので、おそらく同じ事象。
ちなみに 5.8.9 では直ってました

http://rt.perl.org/rt3/Public/Bug/Display.html?id=33945
Deep recursion the regex engine causes a segfault. While there's
nothing that can really be done other than aborting the program
in that case, that should at least be done in orderly fashion.

The condition can easily be reproduced thusly:

perl -le'my $rx; $rx=qr/(??{ $rx })/; ""=~$rx'

http://rt.perl.org/rt3/Public/Bug/Display.html?id=49956
Possibly related to prior bug #33945 (?):

Deep recursion in regex engine causes segmentation fault.

Reproducible sample code:

perl -le'my $rx="b"."a"x99999; $rx=~/b([^b]|c.)+/;'

0 件のコメント: