AUTOSAR C++14 Rule A8-4-7

"в" параметрах для "дешевого, чтобы скопировать" типы буду передан значением

Описание

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

"в" параметрах для "дешевого, чтобы скопировать" типы буду передан значением.

Объяснение

Вы используете "в" параметре, когда вы намереваетесь только считать тот параметр в функции. Если параметр является дешевым, чтобы скопировать, передайте параметр значением к:

  • Проясните, что вы не планируете изменение параметра.

  • Избегайте дополнительной косвенности, которая требуется, чтобы получать доступ к параметру от функции, когда вы передаете параметр ссылкой.

Параметр является дешевым, чтобы скопировать, когда оба этих условия верны:

  • Параметр имеет размер, меньше чем или равный двум словам. Например, для параметра foo, sizeof(foo) <= 2 * sizeof(int).

  • Параметр является тривиально copyable типом. См. is_trivially_copyable.

Реализация Polyspace

  • Polyspace® флаги:

    • const параметры, которые передаются ссылкой, если параметры являются дешевыми, чтобы скопировать (sizeof <= 2 * sizeof(int) и тривиально copyable).

    • const параметры, которые передаются значением, если параметры не являются дешевыми, чтобы скопировать. Например, в этом фрагменте кода, оба параметра str (дорогой, чтобы скопировать) и b (нетривиально copyable), несовместимы.

      void func1(const std::string str);
      struct B {
          B(B const&) {}
      };
      void func2(const B b);
      .

  • Polyspace не отмечает:

    • Non-const параметры, которые передаются ссылкой, если те параметры не являются дешевыми, чтобы скопировать и не изменяются в функции. Polyspace рассматривает эти параметры как "в" параметрах.

    • "в" параметрах, которые передаются ссылкой, если те параметры являются типами только для перемещения. Например, int f(const std::unique_ptr<int>& p);.

    • const параметры, которые передаются ссылкой в конструкторах копии. Например, никакой дефект не повышен на point в этом фрагменте кода.

      class coord
      {
      public:
          coord(int x, int y) {p_x = x; p_y = y;}
          coord(const coord& point) { p_x = obj.p_x; p_y = obj.p_y;}
          //...
      private:
          int p_x, p_y;
      
      
      };
      coord point{1, 1};
      void func(const coord& point);

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

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

Примеры

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

#include <memory>
#include <string>
#include <cstdint>

int func(const std::unique_ptr<int>& ptr) // Compliant
{
    *ptr = *ptr + 1;
    return *ptr;
}
union Small {
    uint8_t var1 ;
    uint8_t var2;
} ;

struct Large {
    std::uint32_t v1;
    std::uint32_t v2;
    std::uint32_t v3;
    std::uint32_t v4;
};

void func2(Small& arg) // Noncompliant
{
//...
}  

void func3(Large val,   // Noncompliant
           std::string& str) // Compliant
{
//...
} 

В этом примере Polyspace отмечает "в" параметрах:

  • arg, потому что это передается ссылкой, и ее тип тривиально copyable. Этот параметр может быть передан значением вместо этого.

  • val, потому что это передается значением, и дорого скопировать. Передача этого параметра ссылкой старается не делать дорогие копии для каждого вызова func3().

Они переданные ссылкой "в" параметрах совместимы:

  • Параметр ptr потому что это - тип только для перемещения.

  • Параметр str потому что дорого скопировать. Этот параметр является non-const но это не изменяется в func3().

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

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