为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数



所以我用我的C++代码在VS 2017中运行了一个分析。它给了我一个缓冲区溢出,如下所示:

TCHAR *sTemp = new TCHAR[5]();
if (sTemp)
    StringCchCopy(sTemp, 5, L"0123456789");

当我逐步完成代码时,sTemp 是"0123",第 4 个位置当然是 \0。

当我对代码运行分析时,出现 C6386 错误:

警告 C6386 写入"sTemp"时缓冲区溢出:可写大小为"无符号整数"字节,但可能会写入"10"字节。

为什么?我还尝试将数组更改为 10,将 StringCchCopy 更改为 5,但仍然出现相同的错误。

警告指的是源字符串永远无法放入目标的事实。源字符串的长度为 10,目标字符串的大小为 5 个代码单元。这完全无关紧要,静态分析器无法确定动态分配的目标数组的大小。

如果是这样,并且它会发现实际大小与您声称的大小不匹配,它将引发错误,而不是警告。

StringCchCopy 的文档说第二个参数必须是目标缓冲区的大小,并且目标缓冲区必须足够大以容纳源字符串。您没有检查函数的返回代码,但我怀疑它会STRSAFE_E_INSUFFICIENT_BUFFER,这意味着"由于缓冲区空间不足,复制操作失败。目标缓冲区包含预期结果的截断、以 null 结尾的版本。在截断可以接受的情况下,这可能不一定被视为失败条件。

https://learn.microsoft.com/en-us/windows/win32/api/strsafe/nf-strsafe-stringcchcopyw

我想您对截断感到满意并期待,但静态分析工具看到源字符串比目标缓冲区长并触发警告。

最新更新