メインコンテンツ

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

符号なし整数定数のオーバーフロー

符号なし整数データ型の範囲外にある定数

説明

この欠陥は、次の場合に発生します。

  • コンパイル時の定数がその値を格納できないデータ型の符号なし整数変数に代入された。

  • enum の潜在型に収まらない enum 値を使用した (かつ、潜在型が符号なしであった)。

n ビット符号なし整数は、範囲 [0, 2n-1] 内の値を保持します。たとえば、c は 8 ビットの符号なし char 型の変数であるため、値 256 を保持できません。

unsigned char c = 256;

この欠陥チェッカーは、次のオプションに依存します。

この欠陥は、次の状況では発生しません。

  • const 変数から新しい定数を作成する (特定のコンパイラのみ)。

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

    const uint16_t c = 0xffffu;
    uint16_t y = c + 1u;
    y でのこのチェックの違反が検出されるかどうかは、コンパイラによって異なります。

  • ビット NOT 演算。

    Polyspace® では、ビット NOT 演算の実行時にこの違反が報告されません。

リスク

C 標準では、オーバーフローした符号なし整数はラップされなければなりません (たとえば、C11 規格の節 6.2.5 を参照)。ただし、そのラップ アラウンド動作は意図されていないことがあり、予期しない結果を引き起こす可能性があります。

修正方法

定数値が意図したものかどうかをチェックします。値が正しい場合は、より大きいデータ型をその変数に使用します。

すべて展開する

#define MAX_UNSIGNED_CHAR 255
#define MAX_UNSIGNED_SHORT 65535

void main() {
    unsigned char c1 = MAX_UNSIGNED_CHAR + 1;
    unsigned short c2 = MAX_UNSIGNED_SHORT + 1;
}

この例では、1 つ以上のマクロを使用するとオーバーフローが起こるため、マクロに欠陥が表示されます。

修正 — より大きなデータ型を使用

1 つの修正方法として、オーバーフローする変数により大きいデータ型を使用します。

#define MAX_UNSIGNED_CHAR 255
#define MAX_UNSIGNED_SHORT 65535

void main() {
    unsigned short c1 = MAX_UNSIGNED_CHAR + 1;
    unsigned int c2 = MAX_UNSIGNED_SHORT + 1;
}

結果情報

グループ: 数値
言語: C | C++
既定値: オフ
コマンド ライン構文: UINT_CONSTANT_OVFL
影響度: Low

バージョン履歴

R2018b で導入