【发布时间】:2022-10-14 13:50:18
【问题描述】:
当我遇到这个 Visual Studio 警告时,我正在编写一些基于 cstring 的代码,我似乎无法正确摆脱(即不使用 #pragma)。
This answer 过去基本上为我解决了这个警告。然而,这里的行为似乎更加离奇。
C6386: Buffer overrun while writing to 'str'.
复制此错误所需的最小代码如下。
void test(const size_t len)
{
char* const str = malloc(len + 1);
if (str == NULL)
{
return;
}
for (size_t i = 0; i < len; i++) { }
str[len] = '\0';
}
最后一行触发此警告消息。
最初,我在循环内有可以写入字符串的代码,但显然循环内的代码对这个警告没有影响。用'a' 填充字符串会在循环后的行上给出相同的警告。
如果我删除循环,即使它什么都不做,警告也会消失。
如果我在 malloc 调用之前为 len 变量添加 0 检查,则警告也会消失。但是,请注意,这是没有意义的。我应该检查的值是(size_t)-1,加上 1 会导致传递给malloc 的参数为 0,这可能会触发这种未定义的行为,在 VS 中出现这个奇怪的警告之前我从未听说过.
是我,还是这里发疯的 Visual Studio 警告系统?因为我觉得我遗漏了一些非常明显的东西,但我看不出这段代码有什么可能出错的地方。
作为参考,len 变量最初是wcslen 调用的结果,它永远不会返回(size_t)-1,因为这样的字符串将是可寻址内存长度的两倍。
我已经编写这种 cstring 操作代码近十年了,从来没有遇到过任何问题。这个警告让我想知道我是否一直在做错事。
编辑:原始代码错误地从 void 函数返回,因为它是来自一个原本更大的函数的 sn-p。这是一个具有适当无价值回报的屏幕截图。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c visual-studio warnings intellisense