Arithmetic operation with NULL pointer

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

Описание

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

Риск

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

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

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

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

См. примеры исправлений ниже.

Примеры

расширить все

#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 тело оператора. Поэтому a NULL указатель сдвигается в операторе ptr++.

Коррекция - Избегайте арифметики указателя NULL

Одной из возможных коррекций является выполнение арифметической операции при 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