我在 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 编码,因此不是可变长度格式(对于某些外来字符使用两个以上字节)?
但是,如果将buffer
其大小调整为 4096 * 2 字节,而StringCchVPrintfW
以字符而不是字节计数,则如果遇到大于 2 字节的字符,可能会导致缓冲区溢出。
我的假设正确吗?如何解决这个问题?