メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2023 Rule 0.0.2

Controlling expressions should not be invariant

R2024b 以降

説明

ルール定義

Controlling expressions should not be invariant. 1

根拠

iffor、または while ステートメントの制御式の値が不変である (たとえば、制御式が常に true または false に評価される) 場合、その式はデッド コードであり、機能的な影響を与えることなく削除できます。コンパイラは、このような不変の式を検出して、最終的な実行可能ファイルから削除することがあります。こうした不変の式の多くはプログラミング エラーを示し、予期せずコードが実行されないという結果を引き起こす可能性があります。

Polyspace 実装

ifforwhile などのステートメントの制御式が定数値に評価される場合、ルール チェッカーは違反を報告します。

トラブルシューティング

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

すべて展開する

この例では以下のようになります。

  • 関数 mightExceedStorageCapacity() 内の式 realReading < UINT32_MAX は、このルールに違反しています。realReading は 2 つの uint8_t 変数の積であることから、UINT32_MAX を超える可能性はないため、この式は常に true に評価されます。

  • 関数 mightExceedHardwareCapacity() 内の式 realReading < UINT8_MAX は定数値に評価されないため、このルールに違反していません。if 分岐と else 分岐は、どちらも到達可能です。

#include <climits>
#include <cstdint>

bool mightExceedStorageCapacity(uint8_t meterReading, uint8_t scale)
{
    uint32_t realReading = meterReading * scale;
    if (realReading < UINT32_MAX) { //Noncompliant
        return true;
    }
    else {
        return false;
    }
}

bool mightExceedHardWareCapacity(uint8_t meterReading, uint8_t scale)
{
    uint32_t realReading = meterReading * scale;
    if (realReading < UINT8_MAX) { //Compliant
        return true;
    }
    else {
        return false;
    }
}

チェック情報

グループ: 言語に依存しない問題
カテゴリ: 推奨

バージョン履歴

R2024b で導入


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.