【发布时间】:2017-06-16 01:50:03
【问题描述】:
我已经阅读了很多关于 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;
}
Analyze->Run Code Analysis->On Solution会给出如下警告:
file.cpp(18):警告 C6386:写入“nWords”时缓冲区溢出:可写大小为“nTotal*4”字节,但可能写入“8”字节。
这是合法的吗?现在,如果我移动全局变量并使其成为本地变量,警告就会消失!
int main()
{
unsigned int nNumItems = 0;
...
}
但我不能像在完整代码中那样做,这是一个成员变量。
同样,如果我将 nTotal 的定义移动到 'new int' 中,我也可以删除警告:
nWords = new int[3 + 2 * nNumItems];
但我不能这样做,因为在完整代码的其他地方提到了 nWords。
这只是 Visual Studio 静态代码分析器的问题,还是此代码的合法问题?
【问题讨论】:
-
不会“解决”问题,而是使用
std::vector<int>。 -
当它是全局的时,也许编译器认为别的东西可能会改变它。所以如果
nNumItems = 0xffffffff,那就是缓冲区溢出。但这并没有改变在这种情况下警告是荒谬的事实。
标签: c++ visual-studio-2015 code-analysis static-code-analysis