所以我用我的C++代码在VS 2017中运行了一个分析。它给了我一个缓冲区溢出,如下所示:
TCHAR *sTemp = new TCHAR[5]();
if (sTemp)
StringCchCopy(sTemp, 5, L"0123456789");当我单步执行代码时,sTemp是"0123",第四个位置当然是\0。
当我对代码运行Analyze时,我得到了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,但仍然出现相同的错误。
发布于 2019-07-10 22:58:40
警告是指这样一个事实,即源字符串永远无法放入目标中。源字符串的长度为10,目标字符串的大小为5个代码单元。静态分析器无法确定动态分配的目标数组的大小,这一点一点也不相关。
如果是这样,它将发现实际大小与您声明的大小不匹配,它将引发一个错误,而不是警告。
发布于 2019-07-10 20:55:20
StringCchCopy的文档指出,第二个参数必须是目标缓冲区的大小,并且目标缓冲区必须足够大以容纳源字符串。您没有检查函数的返回码,但我怀疑它是STRSAFE_E_INSUFFICIENT_BUFFER,这意味着“由于缓冲区空间不足,复制操作失败。目标缓冲区包含预期结果的截断的、以null结尾的版本。在截断可以接受的情况下,这不一定被视为失败条件。”
https://docs.microsoft.com/en-us/windows/win32/api/strsafe/nf-strsafe-stringcchcopyw
我猜你对截断很满意,并且期待截断,但是静态分析工具发现你的源字符串比你的目标缓冲区长,并触发警告。
https://stackoverflow.com/questions/56970980
复制相似问题