exponenta event banner

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