Microsoft Windows SDK の例でこのコードを見つけました。
wstring buffer;
void formatfunction(format, ...) {
VPRINTF_VAR_PARAMS(buffer, format);
do_something_with(buffer);
}
#define VPRINTF_VAR_PARAMS(buffer, format) \
{ \
buffer.resize(MAX_VPRINTF_BUFFER_SIZE, L'\0'); \
va_list marker; \
va_start( marker, format ); \
HRESULT hr = StringCchVPrintfW( \
WString2Buffer(buffer), \
buffer.length(), \
format.c_str(), \
marker ); \
if (FAILED(hr) \
&& (hr != STRSAFE_E_INSUFFICIENT_BUFFER)) \
throw(hr); \
va_end( marker ); \
}
はMAX_VPRINTF_BUFFER_SIZE
大きな定数 (4096) です。今:
はwstring
実際には UTF-16 でエンコードされているため、可変長形式 (特定の外国文字に 2 バイト以上を使用) ではありませんか?
ただし、 のbuffer
サイズが 4096 * 2 バイトに変更された場合、バイトStringCchVPrintfW
数ではなく文字数でカウントされるため、2 バイトを超える文字が検出されると、バッファ オーバーフローが発生する可能性があります。
私の仮定は正しいですか?この問題はどのように対処できますか?