てきとうなさいと べぇたばん

mb_str_padでバグを報告いただいたのでちょっと横槍入れたのと反省文

TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > mb_str_padでバグを報告いただいたのでちょっと横槍入れたのと反省文

Fix GH-11567

mb_str_padという関数が追加される

PHP 8.3より、mb_str_padという、str_padのmbstringバージョンの関数が追加されます。今回はそのバグが出てきたのでそれについて追いかけていきましょう。

mb_str_pad causes access violation ( 0xc0000005) in mbstring.dll #11567

https://github.com/php/php-src/issues/11567

これによると、mb_str_padのデフォルト引数でSegmentation Faultになるというものでした。

$a = mb_str_pad("a", 10);

ぼくは、このような修正案を出してみましたが、RFC https://wiki.php.net/rfc/mb_str_pad からすると誤っていることがわかりました。具体的には、$pad_stringがデフォルト引数で半角スペースになっています。

diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 05c26c652c..42ba5761e0 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -5549,7 +5549,7 @@ PHP_FUNCTION(mb_str_pad) RETURN_STR_COPY(input); } - if (ZSTR_LEN(pad) == 0) { + if (pad == NULL || ZSTR_LEN(pad) == 0) { zend_argument_value_error(3, "must be a non-empty string"); RETURN_THROWS(); }

これをいくらやってもテストコードが通りません。なぜでしょう…?デフォルト引数に半角スペース一文字を加えればよいのですが。

@nielsdosさんは、これを修正しました。 https://github.com/php/php-src/commit/78d98e50c4c051de0aa1af8da51b552135dc569d

zend_string *input, *encoding_str = NULL, *pad = ZSTR_CHAR(' ');

この、 ZSTR_CHARというのは、Interned stringの半角スペースです。それをzend_stringで呼び出しているのですね。こういう方法があったか…!

というわけで、私もまだまだだなという話でした。

2023/07/01 1:07