PHP5.4-5.7でのdeclareにまつわるパーサのバグ

declare(encoding='UTF-8');したときにバグが発生することがわかりました。
2
DQNEO @DQNEO

PHPの終了タグ "?>" の有り無しでパーサの挙動が変わるケースを発見したぞ・・これはバグなのか?

2014-07-23 10:34:10
どぅーあき @do_aki

@DQNEO ぉ、どういうケースでしょ? (気になる)

2014-07-23 10:50:17
DQNEO @DQNEO

@do_aki こんにちわ。Zend Multibyteの記事を読んだので、挙動を確認していたのですが、PHP終了タグ ?> の有無でパーサの挙動が異なるケースを発見しました。これって処理系のバグなんでしょうか・・?gist.github.com/DQNEO/09ee78f8…

2014-07-23 10:52:38
DQNEO @DQNEO

@do_aki gist.github.com/DQNEO/09ee78f8… こちらです。declare(encoding='UTF-8');したときに、終了タグ ?> の有り無しで警告がの有無が変わりました。

2014-07-23 10:58:57
DQNEO @DQNEO

@do_aki 再現しましたか! php-srcにプルリクエスト送るチャンスですかね?(直せる自信がないですがw)

2014-07-23 11:01:19
DQNEO @DQNEO

@ngyuki @do_aki あ!PHP 5.7.0-devで再現しました。(さっきは実行方法が間違ってました。)

2014-07-23 17:23:43
どぅーあき @do_aki

declare(encoding=...) の挙動追ってみないと判らんな……

2014-07-23 11:06:09
どぅーあき @do_aki

declare 宣言を scan した時点で、LANG_SCNG(script_encoding) LANG_SCNG(input_filter) LANG_SCNG(output_filter) が置き換わるのか

2014-07-23 11:10:50
どぅーあき @do_aki

あれ、スキャナって、最初にコンバートするんじゃないの……?

2014-07-23 11:14:05
どぅーあき @do_aki

zend_multibyte_yyinput_again おまえかー。再読込するのか。

2014-07-23 11:15:18
どぅーあき @do_aki

@DQNEO これは、確かにバグっぽい感じですね。 declare によってスクリプトの再読込が行われた場合にスキャナがバッファ長以上喰ってる感じ。 "?>" がある場合は、NULL 文字を喰っても警告にならない(スキャナの状態が異なるため)だけで、過食なのは同じじゃないかな。

2014-07-23 11:41:55
どぅーあき @do_aki

マルチバイト文字増やせば増やすほど 警告出る。 コンバード後のサイズが適切に格納されてないのかねぇ。

2014-07-23 11:46:08
ngyuki @ngyuki

最近の Visual Studio は lex や yy のファイルの中までステップ実行できるのだな

2014-07-23 14:02:20
ngyuki @ngyuki

あ、いや、単に #line が c のソースファイルに出力されているからか

2014-07-23 14:04:22
ngyuki @ngyuki

@do_aki @DQNEO 変換で短くなった文字数だけ余分にパーサがヌルバイト以降を読んでいる感じですかね / gist.github.com/ngyuki/bb90212…

2014-07-23 14:21:03
DQNEO @DQNEO

@ngyuki @do_aki おお・・・早くもパッチが・・!!そしてパッチをあててみたら警告が出なくなった!!

2014-07-23 14:52:48
どぅーあき @do_aki

@ngyuki そのようですね。ただ、何で短くなるのか謎なんですよねー

2014-07-23 14:58:17
ngyuki @ngyuki

@do_aki 文字数(というかバイト数)が短くなるのは単に utf-8 → euc-jp だからではないでしょうか?(script_encoding が euc-jp なので utf-8 のソースが euc-jp に変換される)

2014-07-23 15:00:26
ngyuki @ngyuki

@DQNEO @do_aki 勘で書いたので品質はお察しください

2014-07-23 15:02:12
どぅーあき @do_aki

@ngyuki 手元で utf-8 のファイルで試しても同じ事が起きるのですよ……

2014-07-23 15:02:14
ngyuki @ngyuki

@do_aki ん? スクリプトが utf-8 で書かれていて、script_encoding が euc-jp の場合に発生するのですよね?

2014-07-23 15:03:35
どぅーあき @do_aki

@ngyuki あー。zend.script_encoding を指定しない場合でも発生するのですよ。デフォルトは UTF-8 だと思ってたんですけど、違うのかな……

2014-07-23 15:08:55