メインコンテンツ

AUTOSAR C++14 Rule A8-4-7

"in" parameters for "cheap to copy" types shall be passed by value

説明

ルール定義

"コピーの負担が少ない" 型の "in" パラメーターは値渡しするものとします。

根拠

関数内でパラメーターの読み取りのみを行う場合、"in" パラメーターを使用します。コピーの負担が少ないパラメーターの場合は、次の目的でパラメーターを値で渡します。

  • パラメーターを変更する予定がないことを明確にする。

  • パラメーターを参照で渡す場合に、関数からパラメーターにアクセスするために必要となる追加の間接参照を回避する。

パラメーターのコピーの負担が少なくなるのは、次の両方の条件が当てはまる場合です。

  • パラメーターのサイズが 2 ワード以下である。たとえば、パラメーター foosizeof(foo) <= 2 * sizeof(int) などです。

  • パラメーターがトリビアル コピー可能な型である。"is_trivially_copyable" を参照してください。

Polyspace 実装

  • Polyspace® は、以下に対してフラグを設定します。

    • パラメーターのコピーの負担が少ない場合 (sizeof <= 2 * sizeof(int) およびトリビアル コピー可能) に参照渡しされる const パラメーター。

    • パラメーターのコピーの計算量が多い場合に値渡しされる const パラメーター。たとえば、このコードの抜粋では、パラメーター str (コピーの計算量が多い) と b (非トリビアル コピー可能) の両方が非準拠です。

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

  • Polyspace は以下に対してフラグを設定しません。

    • コピーの計算量が多く、関数内で変更されていない場合に、参照渡しされる非 const パラメーター。Polyspace はこれらのパラメーターを "in" パラメーターと見なします。

    • 移動のみの型である場合に参照渡しされる "in" パラメーター。たとえば、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);

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#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 は次の "in" パラメーターにフラグを設定します。

  • arg。参照渡しされ、トリビアル コピー可能な型であるため。このパラメーターは、代わりに値渡しすることができます。

  • val。値渡しされ、コピーの計算量が多いため。このパラメーターを参照で渡すと、func3() を呼び出すたびに計算量の多いコピーが行われることが回避されます。

参照渡しされる次の "in" パラメーターは準拠しています。

  • パラメーター ptr。移動のみの型であるため。

  • パラメーター str。コピーの計算量が多いため。このパラメーターは非 const ですが、func3() 内では変更されません。

チェック情報

グループ: 宣言子
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入

すべて展開する