Null pointer

NULL указатель разыменовывается

Описание

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

Риск

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

Фиксация

Проверяйте указатель на NULL прежде разыменовывают.

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

Смотрите примеры мер ниже.

Примеры

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

#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] записан в *pP принят, чтобы указать на допустимую ячейку памяти.

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

Одна возможная коррекция должна инициализировать 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++
Значение по умолчанию: On
Синтаксис командной строки: NULL_PTR
Удар: высоко
ID CWE: 476, 690
Введенный в R2013b