MSVCの最新セキュリティアップデートに準拠するために、「レガシー」コードを更新しようとしています。_vsnprintf
から_vsnprintf_s
に移行する際に問題が発生しています。セキュリティで保護された_vsnprintf_sで必要なバッファ長を取得する
特に、私は、数/長さヌルバッファとゼロ_vsnprintf
を呼び出す結果を取得、必要なサイズ(return value + 1
)のバッファを割り当て、その後、新たに割り当てられたバッファで再度_vsnprintf
を呼び出しました既知の正しいサイズ:
size_t length = _vsntprintf(nullptr, 0, mask, params);
TCHAR *final = new TCHAR [length + 1];
_vsntprintf(final, length + 1, mask, params);
この動作はdocumented on MSDNです:
countで指定されたバッファサイズがフォーマットとARGPTRで指定された出力を含むのに十分な大きさでない場合は、 vsnprintfの戻り値は、countが十分に大きい場合に書き込まれる文字数です。戻り値がcount - 1より大きい場合、出力は切り捨てられています。
と同じことをしようとしていますが、its documentation does not contain the sameです。データを格納するために必要なストレージと終端のヌルがsizeOfBufferを超えた場合には文字列ではなく、その場合に限り、パラメーターの検証に記載されたカウントが_TRUNCATEでない限り、無効なパラメータハンドラは、呼び出され、
を語りますbufferに収まるように書かれ、-1が返されます。以下でとにかくそれを試し
:
size_t length = _vsntprintf_s(nullptr, 0, 0, mask, params);
これがゼロの "長さ" になります。回数ではなく、以下のアサーションが失敗したとして、あなたが_TRUNCATE
(-1)に渡した場合:
式:!> 0
バッファ= nullptr & & BUFFER_COUNTを私は_set_invalid_parameter_handler
を上書きすることが可能であると推定しますどのように長さがあるべきかを見いだすが、より簡単な方法が必要ですか?
これは何のCコードではありませんが。 – Olaf
@Olaf申し訳ありませんが、それはC++だったはずです。私はその誤植を逃した 'security-enhanced-crt'タグについて心配していました。あなたは本当にそれがdownvotingの価値があったと思いますか? –
'size_t length = _vsntprintf(nullptr、0、0、mask、params)'の行で、 '_vsntprintf_s'を意味しましたか? – TriskalJM