【问题标题】:Inconsistency of the C6386 warning in Visual Studio 2022Visual Studio 2022 中的 C6386 警告不一致
【发布时间】: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。这是一个具有适当无价值回报的屏幕截图。

【问题讨论】:

标签: c visual-studio warnings intellisense


【解决方案1】:

警告消息如下所示:

它显示:'len' 可能为 NULL。如果 len=0,则循环不成立。

我觉得代码应该改成这样:

void test(const size_t len)
{
    char* const str = malloc(len+1);
    if (len + 1 == 0) 
    {
        return;
    }
    if (str == NULL)
    {
        return;
    }
    for (size_t i = 0; i < len+1; i++) { }
    str[len] = '
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 2020-08-05
  • 2011-02-10
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多