为什么Visual C ++ 2010抱怨'使用未初始化的内存'?

时间:2010-01-13 10:04:17

标签: c++ memory-management

我有一个函数,它接受一个指向缓冲区的指针,以及该缓冲区的大小(通过指针)。如果缓冲区不够大,它会返回一个错误值并在out-param中设置所需的长度:

// FillBuffer is defined in another compilation unit (OBJ file).
// Whole program optimization is off.
int FillBuffer(__int_bcount_opt(*pcb) char *buffer, size_t *pcb);

我称之为:

size_t cb = 12;
char *p = (char *)malloc(cb);
if (!p)
    return ENOMEM;

int result;
for (;;)
{
    result = FillBuffer(p, &cb);
    if (result == ENOBUFS)
    {
        char *q = (char *)realloc(p, cb);
        if (!q)
        {
            free(p);
            return ENOMEM;
        }

        p = q;
    }
    else
        break;
}

Visual C ++ 2010(代码分析最大化)抱怨'warning C6001: Using uninitialized memory 'p': Lines: ...'。它报告的行号覆盖了整个功能。

Visual C ++ 2008没有。据我所知,这段代码没问题。我错过了什么?或者什么是VC2010缺失?

2 个答案:

答案 0 :(得分:3)

这必须是Visual Studio 2010中的错误。包装malloc会删除警告,如以下测试代码所示:

char * mymalloc(int i)  
{  
    return (char *) malloc(i);  
}

// ...

void *r = mymalloc(cb);

char *p;

p = (char *) malloc(cb);

答案 1 :(得分:-1)

您没有检查第一个malloc()是否正常。这导致了警告。