【发布时间】:2019-11-20 02:20:06
【问题描述】:
所以我用我的 C++ 代码在 VS 2017 中运行了分析。它给了我以下缓冲区溢出:
TCHAR *sTemp = new TCHAR[5]();
if (sTemp)
StringCchCopy(sTemp, 5, L"0123456789");
当我单步执行代码时,sTemp 是“0123”,第 4 位当然是 \0。
当我对代码运行分析时,我收到 C6386 错误:
Warning C6386 Buffer overrun while writing to 'sTemp': the writable size is 'unsigned int' bytes, but '10' bytes might be written.
为什么?我也尝试将数组更改为 10,将 StringCchCopy 更改为 5,但仍然出现相同的错误。
【问题讨论】:
-
不是错误,而是警告
-
大概是因为静态分析无法验证缓冲区的大小。改为将其声明为
TCHAR sTemp[5]。另外,除非您需要支持 Windows 98,否则请放弃TCHAR。 -
是的,只是 TCHAR 的习惯。都是统一码。想知道为什么它无法验证大小吗?
-
大概是因为缓冲区是动态分配的,工具没有进行数据流分析。但是你为什么还要惩罚自己呢?只需使用
std::wstring。
标签: c++ winapi tchar buffer-overrun strsafe