メインコンテンツ

AUTOSAR C++14 Rule A5-1-9

Identical unnamed lambda expressions shall be replaced with a named function or a named lambda expression

説明

ルール定義

Identical unnamed lambda expressions shall be replaced with a named function or a named lambda expression.

根拠

名前のないラムダ式を再利用すると、コード内で呼び出すたびにそのラムダ式の本体を挿入することになります。このようなコードの重複は、変更を加えるときに保守性の問題を引き起こす可能性があります。その変更を適用するときにどのラムダ式が同一であるかの特定を間違える可能性があるからです。コードの重複はコードの読みやすさも損ないます。

Polyspace 実装

名前のないラムダ式を最初に使用した後、Polyspace® はその後の同一のラムダ式の各使用箇所にフラグを設定します。たとえば、同じラムダ式を 3 回再利用する場合、Polyspace は 2 回目と 3 回目のラムダ式に別々の違反のフラグを設定します。また、Polyspace は、ソース コードで最初に名前のないラムダ式を使用した箇所を強調表示します。

Polyspace は、グローバル スコープのラムダ式の再利用にはフラグを設定しません。

トラブルシューティング

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

すべて展開する

#include<vector>
#include<algorithm>


void func1(std::vector<int>& v)
{
    if (none_of(v.begin(), v.end(),
    [](int i) {return i % 2 == 1;})) {
        //Handle error
    }

    int odds = std::count_if(v.begin(), v.end(),
    [](int i) {return i % 2 == 1;}); //Noncompliant

    std::vector<int>::iterator first_odd = find_if(v.begin(), v.end(),
    [](int i) {return i % 2 == 1;}); //Noncompliant
}

void func2(std::vector<int>& v)
{
    auto is_odd = [](int i) { return i % 2 == 1;};

    if (none_of(v.begin(), v.end(), is_odd)) {
        //Handle error
    }

    int odds = std::count_if(v.begin(), v.end(), is_odd); //Compliant,
                                                          //reusing named lambda expression 

    std::vector<int>::iterator first_odd = find_if(v.begin(),
            v.end(), is_odd); //Compliant, reusing named lambda expression
}

この例では、名前のないラムダ式 [](int i) {return i % 2 == 1;}func1 内で 2 回再利用されています。Polyspace はこのラムダ式の 2 回目と 3 回目の使用箇所にフラグを設定します。

func2 内のラムダ式の再利用にはフラグは設定されません。ラムダ式に名前 (is_odd) が付けられているからです。

チェック情報

グループ:
カテゴリ: Advisory、Automated

バージョン履歴

R2020b で導入