EXP00-C. 括弧を使用して演算の優先順位を指定する
C プログラマは C の演算子に関する優先順位の規則についてよく間違いを犯す。&
、|
、^
、<<
、>>
の優先順位が直観に反して低いためである。優先順位の規則に関する間違いを避けるには、括弧を適切に使うことである。括弧を防御的に使用することで、エラーを削減することができるし、やりすぎない限りコードの可読性も向上する。
C 標準のセクション 6.5 では部分式 (subclause) の評価順序による演算の優先順位について定義している。
違反コード
このコードの意図は、x
の最下位ビットをテストすることである。
x & 1 == 0
演算子の優先順位の規則により、この式は以下のようにパースされる
x & (1 == 0)
つまり以下のように評価される
(x & 0)
これは 0
になる。
適合コード
以下の適合コードでは、括弧を使って式が期待通りに評価されるようにしている。
(x & 1) == 0
例外
EXP00-EX1: 代数的順序に従う数式には括弧をつける必要はない。例えば次の式
x + y * z
では、数学的慣例に従い、加算の前に乗算が演算される。括弧をつけるのは冗長であろう。
x + (y * z)
リスク評価
優先順位の規則に関する間違いは、式が意図せぬ形で評価される結果を招く恐れがある。これによりプログラムの予期せぬ、異常な動作を引き起こす可能性がある。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
EXP00-C |
低 |
中 |
中 |
P4 |
L3 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
ECLAIR |
1.1 |
exprprns |
実装済み |
LDRA tool suite |
V. 8.5.4 |
361 S |
実装済み |
PRQA QA-C | 8.1 |
3389 |
実装済み |
関連するガイドライン
CERT C++ Secure Coding Standard | EXP00-CPP. Use parentheses for precedence of operation |
ISO/IEC TR 24772:2013 | Operator Precedence/Order of Evaluation [JCW] |
MISRA-C | Rule 12.1 |
参考資料
[Dowd 2006] | Chapter 6, "C Language Issues" (Precedence, pp. 287–288) |
[ISO/IEC 9899:2011] | Section 6.5, "Expressions" |
[Kernighan 1988] | |
[NASA-GB-1740.13] | Section 6.4.3, "C Language" |
翻訳元
これは以下のページを翻訳したものです。
EXP00-C. Use parentheses for precedence of operation (revision 85)