我有一个函数,它接受一个缓冲区的指针,以及该缓冲区的大小(通过指针).如果缓冲区不够大,它会返回一个错误值并在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(代码分析达到最大值)抱怨’警告C6001:使用未初始化的内存’p’:行:……’.它报告的行号覆盖了整个功能.
Visual C 2008没有.据我所知,这段代码没问题.我错过了什么?或者VC2010缺少什么?
最佳答案 这必须是Visual Studio 2010中的错误.包装malloc会删除警告,如以下测试代码所示:
char * mymalloc(int i)
{
return (char *) malloc(i);
}
// ...
void *r = mymalloc(cb);
char *p;
p = (char *) malloc(cb);