AUTOSAR C++14 Rule A9-3-1

Функции членства не должны возвращать непостоянные "необработанные" указатели или ссылки на частные или защищенные данные, принадлежавшие классу

Описание

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

Функции членства не должны возвращать непостоянные "необработанные" указатели или ссылки на частные или защищенные данные, принадлежавшие классу.

Объяснение

Возврат непостоянного указателя или ссылки на частные или данные, находящиеся в собственности защищенного класса включает клиентам для внешне доступа, и измените состояние объекта без интерфейса. Такой доступ без явной интерфейсной силы обходит частную/защищенную иерархию доступа к данным класса, который может привести к неожиданному поведению и привести к ошибкам.

Это правило применяется к данным, которые принадлежат классу. Могут быть возвращены непостоянные указатели на объекты, которые совместно используются различными классами. Классы, которые подражают интеллектуальным указателям и контейнерам, не нарушают это правило.

Реализация Polyspace

Средство проверки отмечает нарушение правила, только если функция членства возвращает non-const указатель или ссылка на нестатический элемент данных. Правило не применяется к статическим элементам данных.

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#include <cstdint>
#include <memory>
#include <utility>

class A
{
  public:
    explicit A(std::int32_t number) : x(number) {}
    std::int32_t&
    GetX() noexcept // Noncompliant
    {
      return x;
    }
 
  private:
    std::int32_t x;
};

void Fn1() noexcept
{
  A a{10};
  std::int32_t& number = a.GetX();
  number = 15; // External modification of private class data
}

В этом примере, class A функция членства GetX() возвращает непостоянный необработанный указатель на x, который является частными данными, принадлежавшими class A. Polyspace® флаги эта реализация как несовместимая. Fn1() демонстрирует проблемы a.GetX() возврат непостоянного необработанного указателя на частные данные о классе, которые затем хранимы и изменяются номером. Класс не имеет никакого контроля над изменениями в его собственном частном элементе данных, который может привести к неожиданному поведению.

#include <cstdint>
#include <memory>
#include <utility>
class B
{
  public:
    explicit B(std::shared_ptr<std::int32_t> ptr) : sharedptr(std::move(ptr)) {}
    std::shared_ptr<std::int32_t> GetSharedPtr() const noexcept // Compliant 
    {
      return sharedptr;
    }
 
  private:
    std::shared_ptr<std::int32_t> sharedptr;
};

void Fn2() noexcept
{
  std::shared_ptr<std::int32_t> ptr = std::make_shared<std::int32_t>(10);
  B b1{ptr};
  B b2{ptr};
  *ptr = 50; // External modification of ptr which shared between b1 and b2
  // instances
  auto shared = b1.GetSharedPtr();
 
  *shared = 100;   // External modification of ptr which shared between b1 and
  // b2 instances
}

В этом примере, class B функциональный GetSharedPtr() возвращает переменную интеллектуального указателя, которая совместно используется экземплярами b1 и b2. Polyspace не отмечает эту реализацию как несовместимую.

#include <cstdint>
#include <memory>
#include <utility>
class C
{
  public:
    explicit C(std::int32_t number)
      : ownedptr{std::make_unique<std::int32_t>(number)}
    {
    }
    const std::int32_t& GetData() const noexcept // Compliant
    {
      return *ownedptr;
    }
 
  private:
    std::unique_ptr<std::int32_t> ownedptr;
};
void Fn3() noexcept
{
  C c{10};
  const std::int32_t& data = c.GetData();
  // data = 20; // Cannot modify data, it is a const reference
}

В этом примере, GetData() возвращает постоянную ссылку. Вы не можете изменить частные данные класса при помощи этой функции членства. Polyspace не отмечает эту реализацию как несовместимую.

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

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