メインコンテンツ

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

符号なしの整数間の演算によるオーバーフロー

説明

この欠陥は、符号なし整数変数に対する演算が、結果のデータ型では表せない値になる可能性がある場合に発生します。変数のデータ型によって、変数ストレージに割り当てられるバイト数が決まり、許容される値の範囲が制限されます。

異なる浮動小数点型への正確なストレージ割り当てはプロセッサに依存します。ターゲット プロセッサ タイプ (-target)を参照してください。

リスク

C11 規格によると、符号なし整数のオーバーフローにより、ラップ アラウンド動作が発生します。ただし、ラップ アラウンド動作は常に望ましいとは限りません。たとえば、計算の結果を配列サイズとして使用し、計算がオーバーフローする場合、その配列サイズは想定よりはるかに小さい可能性があります。

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

この欠陥は次のようにして修正できます。

  • すべての値に適応できるように、演算の結果に対してより大きいデータ型を使用。

  • オーバーフローにつながる値をチェックし、適切なエラー処理を実行。エラー処理コードでは、たとえば、オーバーフローに対する既定のラップ アラウンド動作をオーバーライドし、飽和動作を実装できます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因となっている場合、既定の Bug Finder 解析ではこの欠陥が報告されない可能性があります。特定のシステム入力値を原因とする欠陥の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

すべて展開する

#include <limits.h>

unsigned int plusplus(void) {

    unsigned uvar = UINT_MAX;
    uvar++;
    return uvar;
}

この関数の 3 番目のステートメントで、変数 uvar は 1 つ増加しています。しかし、uvar の値は符号なし整数の最大値であり、整数の最大値に 1 を加えた数は unsigned int では表現できません。C プログラミング言語の規格では、最大値に 1 を加えた値を法としてプログラムが結果を自動的に縮小するため、符号なしのオーバーフローはエラーとは見なされません。この例では、uvarUINT_MAX を法として縮小されます。結果は uvar = 1 です。

修正 — 異なるストレージ型

1 つの修正方法として、演算の結果をより大きいデータ型に保存することができます。この例では、unsigned int ではなく unsigned long long を返すことでオーバーフロー エラーが修正されます。

#include <limits.h>

unsigned long long plusplus(void) {

    unsigned long long ullvar = UINT_MAX;
    ullvar++;
    return ullvar;
}

結果情報

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

バージョン履歴

R2013b で導入