メインコンテンツ

整数のオーバーフロー

整数間の演算のオーバーフロー

説明

この欠陥は、整数変数に対する演算が、その演算が使用するデータ型では表せない値になる場合に発生します。このデータ型はオペランドの型に応じて異なります。このデータ型によって、結果を格納するために割り当てられるバイト数が決まり、許容される値の範囲が制限されます。

次の点に注意してください。

  • オーバーフローの判別に使用されるデータ型は、オペランドのデータ型に基づいています。演算結果を別の変数に割り当てると、別のチェッカー [整数変換のオーバーフロー] が、割り当てられた値によって割り当て先の変数がオーバーフローするかどうかを判別します。たとえば次のような演算があるとします。

    res = x + y;
    このチェッカーは res の型ではなく x および y の型に基づいて、オーバーフローをチェックします。整数変換のオーバーフローのチェッカーは、res の型に基づいてオーバーフローをチェックします。

  • 二項演算の 2 つのオペランドで、演算発生前にプロモーションが行われることがあります。暗黙的なデータ型の変換に関する Code Prover の仮定 (Polyspace Code Prover)も参照してください。

データ型に最適なストレージ割り当てはプロセッサによって異なります。ターゲット プロセッサ タイプ (-target)を参照してください。

リスク

符号付き整数のオーバーフローにより、未定義の動作が発生します。

修正方法

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

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

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

  • オーバーフローにつながる値をチェックし、適切なエラー処理を実行。

通常、オーバーフローを回避するために、次のいずれかの手法を試します。

  • 整数変数値を符号付き整数の範囲の半分の範囲内に制限。

  • オーバーフローする可能性がある演算で、オーバーフローにつながる可能性がある条件をチェックし、演算の結果を使用する方法に応じてラップ アラウンド動作または飽和動作を実装。結果が予測可能になり、以降の計算で安全に使用できます。

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

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

チェッカーの拡張

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

すべて展開する

#include <limits.h>

int plusplus(void) {

    int var = INT_MAX;
    var++;             
    return var;
}

この関数の 3 番目のステートメントで、変数 var は 1 つ増加しています。しかし var の値は整数の最大値であるため、整数の最大値に 1 を加えると int では表現できません。

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

1 つの修正方法として、データ型を変更することができます。演算結果をより大きいデータ型に保存します (32 ビット マシンでは、intlong は同じサイズです)。この例では、32 ビット マシンで int ではなく long long を返すことでオーバーフロー エラーが修正されます。

#include <limits.h>

long long plusplus(void) {

    long long lvar = INT_MAX;
    lvar++;
    return lvar;
}

結果情報

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

バージョン履歴

R2013b で導入