Yappo::タワシ このページをアンテナに追加 RSSフィード

2011-10-19

さっそく Perl の規格上のバグ発見

私の唯一誇れる能力は、誤読である。そのため、私がプログラミング言語の規格を読むのを好むのは、自然なことである。このたび、 Perl の規格上のバグ発見した。なかなか笑えるので紹介する。もちろん、実装者にとっては洒落にならないが。

以下のコードは、現行ドラフトの文面に従うと、well-formedな Perl コードである

package main {
 a: { last a ; }
 b: { next b ; }
}

なぜかというと、現行の Perlドラフト規格は、ラベル付きの last 文と next 文は、 labe l文の中に入ることができるとされている。ラベル文には、文を書ける。また、ブロック文も文である。よって、 Label : { } は well-formed な Dart コードであり、その中で lastnext を使うのも well-formed である・・・はずだ。((あまりにも馬鹿馬鹿しすぎるからマジレスすると、 Perlブロックは一度だけ実行されるループ文と等価なんでこんな事が出来る(see perldoc -f next, perldoc -f last)))

傑作だったのは、現行の実装が、このコードを実際にコンパイルできてしまうということだ。 last 文の方は、期待通りに動いた。つまり

 a: { print("before") ; last a ; print("after") ; }

は、beforeを出力する。

next 文の方は、コンパイルは通るが、実行時に、beforeを吐いて強制終了してしまう。もし規格通りに動いていたならば、無限ループになったはずだ。

この件をバグ報告する馬鹿にみえたか?

参考文献: http://twitter.com/__gfx__/status/126454338947268608

とおりすがりのバグとおりすがりのバグ 2011/10/20 12:54 Perlに規格なんてあったのか。。。
はじめて知った。。。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yappo/20111019/1318984989