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

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
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401

実装済み
関連するガイドライン
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)

Top へ

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