exponenta event banner

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

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

Описание

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

Риск

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

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

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

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

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

Одной из возможных корректировок является выполнение арифметической операции, когда 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++
По умолчанию: Откл.
Синтаксис командной строки: NULL_PTR_ARITH
Воздействие: Низкий
Представлен в R2013b