C and C++


LANG.OPS.OVERLOADS : 間違いやすい演算子のオーバーロード

要旨

[C++のみ] 以下に挙げる演算子のいずれかがオーバーロードされており、且つオーバーロードされたバージョンが一度若しくは複数回使用されています。

|| ||演算子
&& &&演算子
, カンマ演算子
unary & &単項演算子

プロパティ

クラス名 Confusing Operator Overload
日本語クラス名 間違いやすい演算子のオーバーロード
クラス分類 スタイル (style)
ニーモニック LANG.OPS.OVERLOADS
カテゴリー
AUTOSARC++14 AUTOSARC++14:M5-2-11 The comma operator, && operator and the || operator shall not be overloaded.
  AUTOSARC++14:M5-3-3 The unary & operator shall not be overloaded.
MisraC++2008 MisraC++2008:5-2-11 The comma operator, && operator and the || operator shall not be overloaded.
  MisraC++2008:5-3-3 The unary & operator shall not be overloaded.
MisraC++2023 MisraC++2023:16.5.1 The logical AND and logical OR operators shall not be overloaded
  MisraC++2023:16.5.2 The address-of operator shall not be overloaded
CWE CWE:783 Operator Precedence Logic Error
JSF++ JSF++:159 Operators ||, &&, and unary & shall not be overloaded.
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっています。チェックを有効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += allow class="Confusing Operator Overload"

class MyClass{
public:
   bool isTrue() const;
   MyClass add(const MyClass & b) const;
   // ... 

   MyClass * operator&() const{                            /* 'Confusing Operator Overload' warning issued here */
                                                           /* (definition can be inline) */
      return (MyClass *)10000;
   }

   bool operator!() const{                                                      /* not one of the specified operators */
      return !(this->isTrue());
   }
};


bool operator||(const MyClass & lhs, const MyClass & rhs){ /* 'Confusing Operator Overload' warning issued here */
                                                           /* (definition can be out of line) */
   return lhs.isTrue() || rhs.isTrue();
}

bool operator&&(const MyClass & lhs, const MyClass & rhs){ /* 'Confusing Operator Overload' warning issued here */
   return lhs.isTrue() && rhs.isTrue();
}

int operator,(const MyClass & lhs, const MyClass & rhs){   /* 'Confusing Operator Overload' warning issued here */
   return 5;
}

MyClass operator+(const MyClass & lhs, const MyClass & rhs){                     /* not one of the specified operators */
   return lhs.add(rhs);
}

void lang_ops_overloads(MyClass a){
   &a;
   !a;
   a||a;
   a&&a;
   a,a;
   a+a;
}

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。