JPCERT コーディネーションセンター

EXP17-C. 条件式に対してビット単位の演算を行わない

条件式の中でビット単位の AND 演算子(&)やビット単位の OR 演算子(|)を使用しないこと。このような演算子は、プログラマが間違いを犯したことを示唆しており、予期せぬ動作を引き起こす可能性がある。&| はビット単位の演算にのみ使用し、&&|| は論理演算にのみ使用すること。条件式は選択文 (ifswitch)、反復文 (dowhilefor)、または三項条件演算子 (?:) の条件式で構成される。

違反コード

次のコード例では、条件式の中でビット単位の式が使われている。

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)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter