AUTOSAR C++14 Rule A5-3-2

Нулевые указатели не должны быть разыменованы.

Описание

Управляйте определением

Нулевые указатели не должны быть разыменованы.

Объяснение

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

Реализация Polyspace

Указатель флагов средства проверки разыменовывает, где указатель может быть с пустым знаком.

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

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include <iostream>
#include <cstdint>
#include <cstddef>

class A
{
  public:
    A(std::uint32_t a) : a(a) {}
    std::uint32_t GetA() const noexcept
    {
      return a;
    }
  private:
    std::uint32_t a;
};

std::uint32_t Sum(const A* lhs, const A* rhs)
{
  return lhs->GetA() + rhs->GetA(); //Noncompliant
}

A* getAPtr(void); 

int main(void)
{
  A* leftVal = new A(3);
  A* rightVal = getAPtr();
  
  std::uint32_t sum;
  
  if(!rightVal)  {
      sum = Sum(leftVal, rightVal); 
  }
  else 
      sum = 0;

  std::cout << sum << std::endl;
  return 0;
}

В этом примере, порядке if и else пункт был переключен, ведя на случайного нулевого указателя, разыменовывают. Переменная rightVal проверяется на NULL и с пустым знаком из rightVal используется для последующего, разыменовывают в функциональном Sum.

Проверяйте информацию

Группа: Выражения
Категория: Необходимый, Частично автоматизированный
Введенный в R2020b