我已经阅读了很多有关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 …