【问题标题】:Why error C6386 buffer overrun with strsafe.h StringCch functions?为什么错误 C6386 缓冲区溢出 strsafe.h StringCch 函数?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 我对此表示怀疑。警告消息似乎表明该工具无法验证缓冲区的大小。 可写大小为 'unsigned int' 字节 表示该工具不知道缓冲区的大小。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2017-05-12
    • 2010-09-28
    • 2017-06-16
    相关资源
    最近更新 更多