mb_str_padでバグを報告いただいたのでちょっと横槍入れたのと反省文
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > mb_str_padでバグを報告いただいたのでちょっと横槍入れたのと反省文
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で呼び出しているのですね。こういう方法があったか…!
というわけで、私もまだまだだなという話でした。