[スレッド全体]

2016/11/30 (水) 16:30:13 もか 返信 削除
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
[2387] Re5:セキュアなsnprintf関数。
>sprintf_s(out, size, format, ...)
>size - 1文字出力すると末尾に'\0'を付加して終了します。


>countには _TRUNCATE という特別な値を指定できるのですが、
>_TRUNCATEを指定した場合の動作はsprintf_sと等価です。

言っている内容がいまいち理解できないのは、たぶんこの前提が間違ってるからだと思いました。

char test[4];
int ret = _snprintf_s(test, 4, _TRUNCATE, "%s", "1234567890");
>ret=-1 test="123"
int ret = _snprintf_s(test, 4, 3, "%s", "1234567890");
>ret=-1 test="123"
int ret = _snprintf_s(test, 4, 4, "%s", "1234567890");
>実行時エラー
int ret = sprintf_s(test, 4, "%s", "1234567890");
>実行時エラー
こうなるみたいです。
あとsprintf_sはVC2005では存在していなくて「_sprintf_s」ですよね。

>snprintfがない状態になっています。
参考 https://sourceforge.net/p/sakura-editor/patchunicode/82/
>どう倒しても紛らわしいので、
>・VCの _snprintf に対応する auto関数は提供しない。
>・今の auto_snprintf は auto_snprintf_s に変名。

と書かれています。

auto_snprintf_s→サクラでは_TRUNCATE前提でバッファ切り詰めで使う&-1
auto_sprintf_s→あふれたら異常終了
auto_sprintf→あふれないことが保証されたときに使ってもいい
どれも、引数のバッファ長は\0分を含める実装となっていると。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.000][st:0.000]