Arithmetic operation with NULL pointer

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

Описание

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

Риск

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

Фиксация

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

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