考虑以下代码
#include <vector>
#include <tchar.h>
bool foo()
{
std::vector<TCHAR *> arr;
TCHAR *szTableName = (TCHAR *)malloc(sizeof(TCHAR) * 10);
if (!szTableName)
return false;
arr.push_back(szTableName);
memset(arr.back(), 0, sizeof(TCHAR) * 10);
std::vector<TCHAR*>::const_iterator it = arr.begin();
for (; it != arr.end(); it++)
free(*it); // C6001 : Using uninitialized memory '*it.*()'.
arr.clear();
return true;
}
当我使用编译器选项/analyze:WX-
编译上述代码时,visual studio会发出警告
warning C6001: Using uninitialized memory '*it.*()'.: Lines: ....
代码行free(*it);
。
奇怪的是,如果在循环中分配和插入多个内存,则不会看到错误。例如,以下代码不会导致VS2012发出任何错误
#include <vector>
#include <tchar.h>
bool foo()
{
std::vector<TCHAR *> arr;
for(int i = 0; i < 2; i++)
{
TCHAR *szTableName = (TCHAR *)malloc(sizeof(TCHAR) * 10);
if (!szTableName)
return false;
arr.push_back(szTableName);
memset(arr.back(), 0, sizeof(TCHAR) * 10);
}
std::vector<TCHAR*>::const_iterator it = arr.begin();
for (; it != arr.end(); it++)
free(*it);
arr.clear();
return true;
}
答案 0 :(得分:0)
由于operator*
中的iterator
重载,静态分析器可能会感到困惑。我试过跟随它,它没有发出警告:
auto x = *it;
free(x);
和
free((void*)*it);
有趣的是,循环,如果只运行一次(<1
条件),则会发出警告。
这肯定是假阳性,你有两个选择:(a)忽略警告,或(b)以某种方式愚弄/安抚静态分析器。