メインコンテンツ

MISRA C:2023 Rule 12.4

Evaluation of constant expressions should not lead to unsigned integer wrap-around

R2024a 以降

説明

ルール定義

Evaluation of constant expressions should not lead to unsigned integer wrap-around 1 .

根拠

符号なし整数式は厳密にはオーバーフローしませんが、代わりにラップアラウンドが発生します。実行時にモジュロ演算を使用する利点は十分にあるかもしれませんが、コンパイル時に意図的に使用する利点はほとんどなく、ロジック エラーとなる可能性があります。

Polyspace 実装

Polyspace® は、ラップアラウンドを発生させる可能性のある定数式にフラグを設定します。

コンパイラによって、コンパイル時定数の定義方法は異なります。次のコードに含まれる c+1u は、GCC コンパイラでは定数式定数と見なされますが、標準 C コンパイラでは定数式として見なされません。

const uint16_t c = 0xffffu;
uint16_t y = c + 1u;
上記のコードでこのルールに対する違反が表示されるかどうかは、コンパイラによって決まります。

1U のビット単位シフトがラップアラウンドを発生させる可能性がある場合、Polyspace は違反を報告しません。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する


#define DELAY        1000000000u
#define WIDTH        4000000000u

static void fixed_pulse ( void )
{
   int off_time32 = DELAY + WIDTH;    /*Noncompliant*/
   //...
}


static void f4 ( void )
{   const int c = 0xffffffffu;
    int y = c + 1u;                 /* Compliant*/

    //...
}

この例では、定数式 DELAY + WIDTH; を標準 C コンパイラでコンパイルすると、ラップアラウンドが発生する可能性があります。Polyspace は、この式にフラグを設定します。このコードを GCC などの他のコンパイラでコンパイルする場合、式 c+1u でこのルールに対する違反が示される可能性があります。

チェック情報

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

バージョン履歴

R2024a で導入


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.