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

Указатель 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] записан в *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
Влияние: высоко
ID CWE: 476, 690

Введенный в R2013b