Null pointer

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

Описание

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

Риск

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

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

Проверьте указатель на NULL до ссоры.

Если проблема возникает, несмотря на более раннюю проверку на NULL, искать промежуточные события между проверкой и последующим разыменованием. Часто детали результата показывают последовательность событий, которые привели к дефекту. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя 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 с допустимым адресом памяти перед dereference.

#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
Влияние: Высокий
ИДЕНТИФИКАТОР CWE : 476, 690
Введенный в R2013b