exponenta event banner

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

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

Описание

Этот дефект возникает, когда указателю не назначен адрес до отмены привязки.

Риск

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

Зафиксировать

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

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

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