为什么使用strsafe.h StringCch函数会导致C6386缓冲区溢出错误?

时间:2019-07-10 12:44:06

标签: c++ winapi tchar buffer-overrun strsafe

因此,我使用C ++代码在VS 2017中进行了分析。它为我提供了以下缓冲区溢出:

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

单步执行代码时,sTemp为“ 0123”,当然第4个位置为\ 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,并且仍然是相同的错误。

2 个答案:

答案 0 :(得分:0)

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

如果是这样,并且会发现实际尺寸与您声明的尺寸不匹配,则会引发错误,而不是警告。

答案 1 :(得分:-1)

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

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

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