メインコンテンツ

AUTOSAR C++14 Rule A13-2-3

A relational operator shall return a boolean value

説明

ルール定義

関係演算子はブール値を返すものとします。

根拠

C++ 標準ライブラリの関係演算子からの戻り値を直接チェックして、その関係が true か false かを判断できます。関係演算子のオーバーロードはその使用法と一致している必要があります。そうでない場合は、オーバーロードされた関係演算子のユーザーに予期せぬ結果が表示されることがあります。下の例を参照してください。

Polyspace 実装

チェッカーは、bool 型の値を返さない関係演算子のオーバーロードにフラグを設定します。

トラブルシューティング

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

すべて展開する

class aClass {
    int val;
public:
    aClass(int initVal) {
        val = initVal;
    }
    bool operator<=(aClass const& comparingObj )  noexcept{ //Compliant
        return(this->val <= comparingObj.val);
    }
    int operator>=(aClass const& comparingObj ) noexcept { //Noncompliant
        return(this->val <= comparingObj.val? -1:1);
    }
};

void func() {
    aClass anObj(0), anotherObj(1);
    if(anObj <= anotherObj) {
        /* Do something */
    }
    if(anObj >= anotherObj) {
        /* Do something else */
    }
}

この例では、operator<= のオーバーロードはブール値を返しますが、operator>= のオーバーロードはブール値を返しません。しかし、関数 func では、オーバーロードされた演算子からブール値が返されたかのように演算子の <=>= が使用されます。operator>= のオーバーロードは値 0 を返さないため、2 つ目の if ステートメントは常に true で、想定外の結果になります。

チェック情報

グループ: オーバーロード
カテゴリ: Required、Automated

バージョン履歴

R2020a で導入