首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用strsafe.h StringCch函数时会出现C6386缓冲区溢出错误?

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

Stack Overflow用户
提问于 2019-07-10 20:44:07
回答 2查看 258关注 0票数 0

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

代码语言:javascript
复制
TCHAR *sTemp = new TCHAR[5]();
if (sTemp)
    StringCchCopy(sTemp, 5, L"0123456789");

当我单步执行代码时,sTemp是"0123",第四个位置当然是\0。

当我对代码运行Analyze时,我得到了C6386错误:

代码语言:javascript
复制
Warning C6386   Buffer overrun while writing to 'sTemp':  the writable size is 'unsigned int' bytes, but '10' bytes might be written.

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

EN

回答 2

Stack Overflow用户

发布于 2019-07-10 22:58:40

警告是指这样一个事实,即源字符串永远无法放入目标中。源字符串的长度为10,目标字符串的大小为5个代码单元。静态分析器无法确定动态分配的目标数组的大小,这一点一点也不相关。

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

票数 0
EN

Stack Overflow用户

发布于 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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56970980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档