Имам функция, която взема указател към буфер и размера на този буфер (чрез указател). Ако буферът не е достатъчно голям, той връща стойност за грешка и задава необходимата дължина в 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?
realloc()
, когатоp
е NULL (т.е. ако оригиналниятmalloc()
е неуспешен). Или самиятFillBuffer()
се държи зле в този случай? В кой случай VC++ е на топката? - person j_random_hacker   schedule 13.01.2010