sprintf のバグNo.08698
IKKI さん 15/09/03 22:10
 
秀丸担当さん、こんばんは。

sprintf 関数をさっそく試してみました。
%s の置換結果が70バイト程度でぶっちぎられてしまうようです。長さ無制限にでき
ませんか。

// テスト.mac
$fs = sprintf("%s", "亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴
絢綾鮎或粟袷安庵按暗案闇鞍");
insert "「" + $fs + "」 " + str(wcslen($fs)) + " " + str(strlen($fs));
$fs = sprintf("%s", "𠂉丂丏丒丩丫&#2001
4;乀乇么𠂢乑㐆𠂤乚乩
亝㐬㐮亹亻𠆢亼仃仈&#2
0176;仫仚仱仵k伖佤伷伾&#203
08;佘𠈓佷佸");
insert "「" + $fs + "」 " + str(wcslen($fs)) + " " + str(strlen($fs));

// 実行結果
「亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵」 3
5 70
「𠂉丂丏丒丩丫丮乀乇&
#20040;𠂢乑㐆𠂤」 17 28

今のところ、気づいた点は以上です。また何かあればこのスレッドで随時ご報告しま
す。

秀丸エディタ v8.56β3

[ ]
RE:08698 sprintf のバグNo.08700
秀丸担当 さん 15/09/04 08:56
 

早速バグ情報ありがとうございます。
確かにその通りでした。
こちらもすぐに修正させていただきます。

[ ]
RE:08700 sprintf のバグNo.08704
colder さん 15/09/06 23:35
 
colderです

こちらでもsprintfのバグを見つけたのでこのスレッドで報告します。

書式指定でフィールド幅無しで精度指定がある場合、正常に動作していません。
//テストマクロ
$s = sprintf("%.4d",100);
insert $s;

秀丸ver8.56β4

[ ]
RE:08704 sprintf のバグNo.08705
秀丸担当 さん 15/09/07 13:39
 

確かにその通りでした。
dの場合もこういう書き方ができるということで、できるように修正させていた
だきます。
Cランタイムライブラリのsprinfに渡す前に、事前にチェックしているのですが、
チェックで除外しないように修正します。

[ ]
RE:08705 sprintf のバグNo.08706
colder さん 15/09/07 22:59
 
>dの場合もこういう書き方ができるということで、できるように修正させていた
>だきます。
よろしくお願いします。
一応、念のために書いておきますが、Cだと%sの場合もこういう書き方ができるんで
すが、マクロの方はできていないのでこちらも合わせて修正お願いします。
& 文字列にサロゲートペアの文字を渡すと出力がサロゲートペアの半分だけで切れて
しまうことがあります。
サロゲートペアの文字も一文字と数えるか、少なくともサロゲートペアの半分だけが
出力されないように修正お願いします。

$s = sprintf("%.4s","abcdefg"); // うまくいかない
insert $s;
$s = sprintf("%10.5s","𠀋𠀋𠀋"); // サロゲートペアの半
分だけが出力される
insert $s;

秀丸ver8.56β4

[ ]
RE:08706 sprintf のバグNo.08707
秀丸担当 さん 15/09/08 10:29
 

"%.4s"のほうは、合わせて修正させていただきます。
サロゲートペアのほうは、簡単ではなさそうです。
全て自前で処理しているわけではなく、バッファが壊れないように事前にチェッ
クをしてから、CのUnicode版のswprintfを使っています。
Cのswprintfもサロゲートペアについては同様で、その仕様に従うとしたら現状
で合っているということになると思います。
秀丸エディタで独自に半分にならないようにするとしたら、処理後に半分の部分
を除去するということになると思います。
従来より、SJIS全角のleftstr, サロゲートペアのwcsleftstrなども半分で切れ
るので、sprintfだけ特別な処理をするのも、どうでしょうか。
いずれにしても、sprintfはバッファが壊れる危険性が高いので、バッファが壊
れるリスクが少ないようにしたいところです。

[ ]