EXP17-C. 条件式に対してビット単位の演算を行わない
条件式の中でビット単位の AND 演算子(&)やビット単位の OR 演算子(|)を使用しないこと。このような演算子は、プログラマが間違いを犯したことを示唆しており、予期せぬ動作を引き起こす可能性がある。&
と |
はビット単位の演算にのみ使用し、&&
と ||
は論理演算にのみ使用すること。条件式は選択文 (if
、switch
)、反復文 (do
、while
、for
)、または三項条件演算子 (?:
) の条件式で構成される。
違反コード
次のコード例では、条件式の中でビット単位の式が使われている。
if (!(getuid() & geteuid() == 0)) { /* ... */ }
適合コード
次の適合コードでは、条件式内の論理演算に対して &&
演算子を使っている。
if (!(getuid() && geteuid() == 0)) { /* ... */ }
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
Coverity |
6.5 |
CONSTANT_EXPRESSION_RESULT |
論理演算子の代わりにビット単位の演算子が使われている事例、またはその逆の事例を検出できる。状況によっては、そのような使い方が望ましい可能性もあるため、追加の確認が必要である。 |
関連するガイドライン
ISO/IEC TR 24772:2013 | Likely Incorrect Expression [KOA] |
MITRE CWE | CWE-480, Use of incorrect operator |
参考資料
[Hatton 1995] | Section 2.7.2, "Errors of Omission and Addition" |
翻訳元
これは以下のページを翻訳したものです。
EXP17-C. Do not perform bitwise operations in conditional expressions (revision 24)