Arithmetic operation with NULL pointer

Арифметическая операция выполняется на NULL указатель

Описание

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

Риск

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

Исправление

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

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

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

Примеры

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

#include<stdlib.h>

int Check_Next_Value(int *loc, int val) 
 {
  int *ptr = loc, found = 0; 
  
  if (ptr==NULL)
   { 
      ptr++; 
      /* Defect: NULL pointer shifted */

      if (*ptr==val) found=1;
   } 
   
  return(found);    
 }

Когда ptr NULL указатель, код вводит if тело оператора. Поэтому NULL указатель смещен в операторе ptr++.

Коррекция — избегает арифметики нулевого указателя

Одна возможная коррекция должна выполнить арифметическую операцию когда ptr не NULL.

#include<stdlib.h>

int Check_Next_Value(int *loc, int val) 
 {
  int *ptr = loc, found = 0; 
  
  /* Fix: Perform operation when ptr is not NULL */
  if (ptr!=NULL)
   { 
      ptr++;

      if (*ptr==val) found=1;
   }
   
  return(found);    
 }

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

Группа: Статическая память
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: NULL_PTR_ARITH
Удар: низко
Введенный в R2013b