Win32 unicode swprintf_s 调用生成缓冲区溢出警告
Win32 unicode swprintf_s call generates buffer overrun warning
我正在使用 C++ 编写一个针对 Win32 的小型应用程序。编译器设置为支持 unicode,我正在 x64 模式下编译。我正在使用 Visual Studio 2019.
每次我打电话给 swprintf_s
,如下所示:
wchar_t buff[500] = { 0 };
swprintf_s(buff, sizeof(buff), L"Could not free DLL handle: 0x%X\n", GetLastError());
OutputDebugString(buff);
...我收到以下 C6386 compiler warning:
C6386: Buffer overrun while writing to 'buff': the writable size is '1000' bytes, but '2000' bytes might be written.
作为实验,如果我将缓冲区的大小加倍...
wchar_t buff[1000] = { 0 };
swprintf_s(buff, sizeof(buff), L"Could not free DLL handle: 0x%X\n", GetLastError());
OutputDebugString(buff);
...警告中的范围只是根据以下内容向上移动:
C6386: Buffer overrun while writing to 'buff': the writable size is '2000' bytes, but '4000' bytes might be written.
我想知道是否有人可以帮助我理解为什么上面的代码(当显式传递缓冲区大小时)生成缓冲区溢出警告,以及我如何解决这个问题。
正如 van dench 所说,第二个参数是字符数,而不是缓冲区的大小(以字节为单位)。
正确代码:
wchar_t buff[500] = { 0 };
swprintf_s(buff, 500, L"Could not free DLL handle: 0x%X\n", GetLastError());
OutputDebugString(buff);
我正在使用 C++ 编写一个针对 Win32 的小型应用程序。编译器设置为支持 unicode,我正在 x64 模式下编译。我正在使用 Visual Studio 2019.
每次我打电话给 swprintf_s
,如下所示:
wchar_t buff[500] = { 0 };
swprintf_s(buff, sizeof(buff), L"Could not free DLL handle: 0x%X\n", GetLastError());
OutputDebugString(buff);
...我收到以下 C6386 compiler warning:
C6386: Buffer overrun while writing to 'buff': the writable size is '1000' bytes, but '2000' bytes might be written.
作为实验,如果我将缓冲区的大小加倍...
wchar_t buff[1000] = { 0 };
swprintf_s(buff, sizeof(buff), L"Could not free DLL handle: 0x%X\n", GetLastError());
OutputDebugString(buff);
...警告中的范围只是根据以下内容向上移动:
C6386: Buffer overrun while writing to 'buff': the writable size is '2000' bytes, but '4000' bytes might be written.
我想知道是否有人可以帮助我理解为什么上面的代码(当显式传递缓冲区大小时)生成缓冲区溢出警告,以及我如何解决这个问题。
正如 van dench 所说,第二个参数是字符数,而不是缓冲区的大小(以字节为单位)。
正确代码:
wchar_t buff[500] = { 0 };
swprintf_s(buff, 500, L"Could not free DLL handle: 0x%X\n", GetLastError());
OutputDebugString(buff);