VS2012静态代码分析器在解除分配内存向量时给出误报

时间:2014-10-21 10:51:40

标签: c++ visual-c++ code-analysis

考虑以下代码

#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;
}

1 个答案:

答案 0 :(得分:0)

由于operator*中的iterator重载,静态分析器可能会感到困惑。我试过跟随它,它没有发出警告:

auto x = *it;
free(x); 

free((void*)*it);

有趣的是,循环,如果只运行一次(<1条件),则会发出警告。 这肯定是假阳性,你有两个选择:(a)忽略警告,或(b)以某种方式愚弄/安抚静态分析器。