exponenta event banner

Правило AUTOSAR C++ 14 A5-3-2

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

Описание

Определение правила

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

Объяснение

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

Внедрение Polyspace

Средство проверки помечает отклонения указателей, где указатель может иметь значение NULL.

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#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, а значение NULL равно rightVal используется для последующей отмены привязки в функции Sum.

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

Группа: Выражения
Категория: Обязательный, частично автоматизированный
Представлен в R2020b