Почему Visual C ++ 2010 жалуется на «использование неинициализированной памяти»? - PullRequest
4 голосов
/ 13 января 2010

У меня есть функция, которая принимает указатель на буфер и размер этого буфера (через указатель). Если буфер недостаточно большой, он возвращает значение ошибки и устанавливает необходимую длину в выходном параметре:

// 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 ]

3 голосов
/ 13 января 2010

Это должно быть ошибка в Visual Studio 2010. Обтекание malloc удаляет предупреждение, как в следующем протестированном коде:

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

// ...

void *r = mymalloc(cb);

char *p;

p = (char *) malloc(cb);
0 голосов
/ 13 января 2010

Вы не проверили, в порядке ли первый malloc (). Это приводит к предупреждению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...