exponenta event banner

Нулевой указатель

NULL указатель обнулен

Описание

Этот дефект возникает при использовании указателя со значением NULL как если бы она указывала на допустимую ячейку памяти.

Риск

Переопределение нулевого указателя является неопределенным поведением. В большинстве реализаций отмена привязки может привести к аварийному завершению программы.

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

Проверьте указатель для NULL перед исключением.

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

См. примеры исправлений ниже.

Примеры

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

#include <stdlib.h>

int FindMax(int *arr, int Size) 
{
 int* p=NULL;

 *p=arr[0];
 /* Defect: Null pointer dereference */

 for(int i=0;i<Size;i++)
  {
   if(arr[i] > (*p))
     *p=arr[i];    
  }

 return *p;
}

Указатель p инициализируется со значением NULL. Однако, когда значение arr[0] записывается в *p, p предполагается, что указывает на допустимую ячейку памяти.

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

Одной из возможных корректировок является инициализация p с допустимым адресом памяти до отмены передачи.

#include <stdlib.h>

int FindMax(int *arr, int Size) 
{
 /* Fix: Assign address to null pointer */
 int* p=&arr[0];       

 for(int i=0;i<Size;i++)
  {
   if(arr[i] > (*p))
     *p=arr[i];    
  }

 return *p;
}

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

Группа: Статическая память
Язык: C | C++
По умолчанию: Вкл.
Синтаксис командной строки: NULL_PTR
Воздействие: Высокое
CWE ID: 476, 690
Представлен в R2013b