Non-initialized pointer

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

Описание

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

Риск

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

Исправление

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

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

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

    *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