メインコンテンツ

MISRA C++:2008 Rule 5-0-2

Limited dependence should be placed on C++ operator precedence rules in expressions.

説明

ルール定義

Limited dependence should be placed on C++ operator precedence rules in expressions. 1

根拠

小かっこを使用して評価の順序を明確に示します。

演算子の優先順位によっては、次の問題が発生することがあります。

  • コード レビュー担当者がコードをレビューする場合に、意図されている評価順がすぐにはわからない。

  • 評価の結果が予想と一致しない可能性がある。次に例を示します。

    • 演算 *p++ では、デリファレンスされた値がインクリメントされるとの予想が可能。しかし、ポインター p はデリファレンスの前にインクリメントされている。

    • 演算 (x == y | z) では、xy | z と比較されるとの予想が可能。しかし、== 演算は | 演算の前に行われている。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdio>

void showbits(unsigned int x) {
    for(int i = (sizeof(int) * 8) - 1; i >= 0; i--) {
       (x & 1u << i) ? putchar('1') : putchar('0'); // Noncompliant 
    }
    printf("\n");
}

この例で、チェッカーは演算 x & 1u << i にフラグを設定します。このステートメントが、<< 演算は & 演算の前に実行されるという演算子の優先順位のルールに依存しているからです。これが意図した順序の場合、この演算は x & (1u << i) と書き換えられます。

チェック情報

グループ: Expressions
カテゴリ: 推奨

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.