メインコンテンツ

AUTOSAR C++14 Rule A8-4-8

Output parameters shall not be used

R2021a 以降

説明

ルール定義

Output parameters shall not be used.

根拠

関数に非 const 参照またはポインター パラメーターとして変数を渡し、その変数に関数の出力値を格納することができます。次に例を示します。

void func(const T* input_var, T* output_var); //declaration
void func(const T* input_var, T* output_var)
{
    *output_var = *input_var % 2;
}

ただし関数宣言からは、出力パラメーター output_varfunc に値を渡してから出力を格納するのか (in-out パラメーター)、あるいは output_var が出力だけを格納するのか (out パラメーター) どうかは明確にわかりません。そのため、たとえば関数で非 NULL パラメーターが想定されているときに NULL パラメーターを渡すなど、開発者がパラメーターを誤って使用する可能性があります。

戻り値を使用して関数の出力を格納してください。戻り値は意図を明確にして、渡されたパラメーターが不適切に使用されることを防止します。次に例を示します。

T* func(const T* input_var)
{
    return *input_var % 2;
}

Polyspace 実装

Polyspace® は、以下の要素のパラメーター リストでの非 const 参照またはポインターの使用のすべてにフラグを設定します。

  • 関数 (main() を除く)。

  • クラスのコンストラクターと演算子。

コードに関数宣言と関数定義が含まれている場合、Polyspace は関数定義内で違反にフラグを設定します。

メモ

Polyspace は、そのパラメーターが出力パラメーターとして使用されていない場合でも、パラメーター リストで非 const 参照またはポインターにフラグを設定します。

トラブルシューティング

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

すべて展開する

#include<iostream>

std::int32_t func(const std::vector<int32_t>& inParam,
                  std::vector<int32_t>& outParam)  //  Non-Compliant
{
    //...
	return 1;
}

class C
{
public:

    C(C* ptr) {}         //  Non-Compliant
    C(C& ref) {}         //  Non-Compliant
    C(C&& rvalue_ref) {} //  Compliant
    C(const C& c) {}     //  Compliant
    C(const C&& c) {}    //  Compliant

    C& operator=(C& ref) { return *this; }    //    Non-Compliant

};

次の例では、func の戻り値の型は std::int32_t ですが、そのパラメーター リストは非準拠です。その理由は、パラメーター リストに非 const の lvalue 参照 outParam が含まれているためです。同様に、クラスのコンストラクターと ptr で使用されている非 const パラメーター ref および operator= は非準拠です。

非 const パラメーター rvalue_ref は準拠しています。これは、rvalue 参照のパラメーターが一時オブジェクトのみにバインドしており、関数がスコープから外れるとこれらの一時オブジェクトを参照できなくなるためです。

チェック情報

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

バージョン履歴

R2021a で導入