Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2008-08-26

無限ループを回避するモジュール

| 21:04 | 無限ループを回避するモジュール - NaN days を含むブックマーク はてなブックマーク - 無限ループを回避するモジュール - NaN days

こないだ id:antipop がコードに無限ループを仕込んで開発サーバを重くしたので、今後二度とそのようなことがないようにしたいと思った。そこで最近話題の REXMLのDoS脆弱性 を参考にし、use するだけで while が 1000回までしかまわらなくなるモジュールを書いてあげた。名前は Safe::While がいいと思ったんだけど Acme でやれと言われたので Acme::Safe::While. ソースフィルタを使ったけど誤爆まくるので PPI か何かを使いたい。

テストがこんな感じ。失敗すると終わりません。

use Test::Base;
use Acme::Safe::While '100';
use Test::More tests => 5;

while (1) { }
ok(1, 'simple while');

0 while 1;
ok(1, 'simple postfix while');

do { undef } while 'unko' =~ /(.)/;
ok(1, 'simple do-while');

my $cnt = 0; $cnt++ while 42 == 42;
is($cnt, 100, 'while stop exactly at 100');

while (1) {
    while (2) {
        last;
    }
}
ok(1, 'nested while');

http://github.com/motemen/acme-safe-while/tree/master