メインコンテンツ

AUTOSAR C++14 Rule A8-4-9

"in-out" parameters declared as T & shall be modified

R2021a 以降

説明

ルール定義

"in-out" parameters declared as T & shall be modified.

根拠

関数内で読み取りと変更の両方を意図した関数パラメーターは "in-out" パラメーターと呼ばれます。

パラメーターの読み取りと変更の両方は行わない場合、関数プロトタイプがパラメーターの実際の性質を反映するようにするため、非 const 参照で渡すことは避けてください。

  • 関数内でパラメーターの読み取りのみを行う場合、パラメーターは実際には "in" パラメーターです。

    パラメーターを const 参照で渡します。

  • 関数内でパラメーターの内容全体を置き換える場合、パラメーターは実際には "out" パラメーターです。

    可能な場合は "out" パラメーターの使用は完全に避けて、関数の出力を関数戻り値に格納します。AUTOSAR C++14 Rule A8-4-8 も参照してください。

Polyspace 実装

チェッカーは、非 const 参照で渡された各関数パラメーターをチェックし、関数内でそのパラメーターが読み取りのみである場合、または関数内でその値が完全に置き換えられる場合、違反を報告します。

以下の場合、チェッカーは違反を報告しません。

  • パラメーターがオブジェクトであり、その 1 つ以上のデータ メンバーにアクセスしているか、非 const メンバー関数を呼び出している。

  • もう 1 つの関数にパラメーターへのポインターまたは参照を渡している。

  • 関数がバーチャル関数である。この理由は、現在の関数でパラメーターを変更していないとしても、対応するパラメーターを関数のオーバーライドで変更する可能性があるからです。

  • 関数が使用されていないクラス メソッドである。

トラブルシューティング

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

すべて展開する

#include <cstdint>
#include <vector>
#include <numeric>
#include <string>

int32_t addAllElements (std::vector<int32_t>& aVec) { //Noncompliant
     return std::accumulate(aVec.cbegin(), aVec.cend(), 0); 
}

int32_t addEveryElement (const std::vector<int32_t>& anotherVec) { //Compliant
     return std::accumulate(anotherVec.cbegin(), anotherVec.cend(), 0); 
}

この例で、ベクトル aVec は非 const 参照として関数 addAllElements に渡されています。しかし、このベクトルは関数内で読み取りのみなので "in" のみのパラメーターであり、"in-out" パラメーターではありません。

関数 addEveryElement は同じ関数の準拠バージョンです。"in" パラメーター anotherVecconst 参照として渡されています。

#include <string>

void replaceString(std::string &Source, const std::string Replacement) { //Noncompliant
    if(Replacement.at(0)=='_')
         Source = Replacement; 
    else
         Source = "_null";
}

std::string replacementString(const std::string str) { //Compliant
    if(str.at(0)=='_')
         return str; 
    else
         return "_null";
}

この例で、string Source は非 const 参照として関数 replaceString に渡されています。しかし、この文字列は関数内で完全に置き換えられるので "out" のみのパラメーターであり、"in-out" パラメーターではありません。

関数 replacementString は同じ関数の準拠バージョンです。これは AUTOSAR C++14 Rule A8-4-8 にも違反しません。この関数は replaceString と同じ出力ですが、出力を戻り値に格納します。

チェック情報

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

バージョン履歴

R2021a で導入