Неинициализированный указатель

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

Описание

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

Риск

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

Фиксация

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

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

Смотрите примеры мер ниже. Это - хорошая практика, чтобы инициализировать указатель на 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 NULL или нет.

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

Одно возможное исправление должно присвоить адрес 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++
Значение по умолчанию: на
Синтаксис командной строки: NON_INIT_PTR
Влияние: высоко
ID CWE: 456, 457, 824, 908

Введенный в R2013b