Non-initialized pointer

Указатель, не инициализированный прежде, разыменовывает

Описание

Этот дефект происходит, когда указатель не присвоен, адрес прежде разыменовывает.

Риск

Если указатель явным образом не присвоен адрес, он указывает на непредсказуемое местоположение.

Фиксация

Фиксация зависит от первопричины дефекта. Например, вы присвоили адрес указателю, но присвоение недостижимо.

Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже. Это - хорошая практика, чтобы инициализировать указатель на NULL при объявлении указателя.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

развернуть все

#include <stdlib.h>

int* assign_pointer(int* prev)
{
    int j = 42;
    int* pi;

    if (prev == NULL) 
      {
        pi = (int*)malloc(sizeof(int));
        if (pi == NULL) return NULL;
      }

    *pi = j;                    
    /* Defect: Writing to uninitialized pointer */

    return pi;
}

Если prev не NULL, указатель pi не присвоен адрес. Однако pi разыменовывается на каждом выполнении пути, независимо от ли prev isNull или нет.

Коррекция — инициализирует указатель на каждом пути к выполнению

Одна возможная коррекция должна присвоить адрес pi когда prev не NULL.

#include <stdlib.h>

int* assign_pointer(int* prev)
{
    int j = 42;
    int* pi;

    if (prev == NULL) 
       {
        pi = (int*)malloc(sizeof(int));
        if (pi == NULL) return NULL;
       } 
    /* Fix: Initialize pi in branches of if statement  */
    else 
        pi = prev;              
    

    *pi = j;

    return pi;
}

Информация о результате

Группа: Поток данных
Язык: C | C++
Значение по умолчанию: On
Синтаксис командной строки: NON_INIT_PTR
Удар: высоко
ID CWE: 456, 457, 824, 908
Введенный в R2013b