小编Tom*_*m M的帖子

Visual Studio 2015代码分析C6386警告缓冲区溢出

我已经阅读了很多有关Visual Studio代码分析警告C8386的内容,但是无法弄清楚我的代码中的这个特定问题。我将其简化为以下小程序:

unsigned int nNumItems = 0;

int main()
{
    int *nWords=nullptr;
    unsigned int nTotal;

    nTotal = 3 + 2 * nNumItems;
    nWords = new int[nTotal];

    nWords[0] = 1;
    nWords[1] = 2; // this is line 18, warning C6386

    delete[] nWords;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

分析->运行代码分析->在解决方案中将给出以下警告:

file.cpp(18):警告C6386:写入'nWords'时缓冲区溢出:可写大小为'nTotal * 4'字节,但可能写入了'8'字节。

这是合法的吗?现在,如果我移动全局变量并将其设置为局部变量,警告将消失!

int main()
{
    unsigned int nNumItems = 0;
...
}
Run Code Online (Sandbox Code Playgroud)

但是我不能像完整的代码那样执行此操作,这是一个成员变量。

同样,如果将nTotal的定义移到new int ”中,我也可以删除警告:

    nWords = new int[3 + 2 * nNumItems];
Run Code Online (Sandbox Code Playgroud)

但是我不能这样做,因为完整代码中的其他地方都引用了nWords

这仅仅是Visual …

c++ code-analysis static-code-analysis visual-studio-2015

5
推荐指数
2
解决办法
2503
查看次数