zend multibyte のバグ

PHP
1
DQNEO @DQNEO

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

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

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

2014-07-23 10:50:17
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
どぅーあき @do_aki

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

2014-07-23 11:41:55
DQNEO @DQNEO

@do_aki なるほどー。ちょっとGDBで挙動を確認してみます。ありがとうございます。

2014-07-23 12:52:50
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
ngyuki @ngyuki

@do_aki どうもデフォルトは ISO-8859-1 かなにかっぽいです

2014-07-23 15:15:05
DQNEO @DQNEO

@ngyuki @do_aki そしてgit cloneしてきた最新のphp-srcではこのバグが発生しない気がします・・

2014-07-23 15:16:16
DQNEO @DQNEO

@ngyuki @do_aki やはりPHP 5.7.0-dev では再現しませんでした。

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

@DQNEO @ngyuki 5.6.0 beta4 ですでに起きなくなってますね

2014-07-23 16:39:32
ngyuki @ngyuki

@do_aki @DQNEO zend.script_encoding ではなく mbstring.internal_encoding を指定すると起きませんか? そもそも zend.script_encoding で指定するのが間違いでした・・・

2014-07-23 17:09:28
DQNEO @DQNEO

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

2014-07-23 17:23:43
DQNEO @DQNEO

まとめを更新しました。「PHP5.4-5.7でのdeclareにまつわるパーサのバグ」 togetter.com/li/696842

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

@DQNEO @ngyuki 5.5.14 と 5.6.0 とで逆の動きしててナニガナンダカ…… gist.github.com/do-aki/a652f67…

2014-07-23 18:33:24
ngyuki @ngyuki

@do_aki @DQNEO zend multibyte ってscript_encoding とinternal_encoding が異なるときはスクリプトが script_encoding から internal_encoding に変換されますよね?

2014-07-23 19:41:27