メインコンテンツ

ISO/IEC TS 17961 [intoflow]

Overflowing signed integers

説明

ルール定義

符号付き整数のオーバーフロー。1

Polyspace 実装

このチェッカーは以下の問題をチェックします。

  • 整数のオーバーフロー

  • 整数定数のオーバーフロー

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

チェッカーの拡張

入力値が不明であり、入力のサブセットのみが問題の原因となっている場合、Bug Finder が "整数のオーバーフロー""整数定数のオーバーフロー" を検出しない場合があります。特定のシステム入力値を原因とする違反の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

すべて展開する

問題

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

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

リスク

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

修正方法

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

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

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

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

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

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

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

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

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

例 - 整数の最大値に加算する
#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;
}
問題

整数定数のオーバーフローは、コンパイル時の定数を、その値を格納できないデータ型をもつ符号付き変数に代入すると発生します。n ビット符号付き整数は、範囲 [-2n-1, 2n-1-1] 内の値を保持します。

たとえば、c は 8 ビットの符号付き char 型の変数であるため、値 255 を保持できません。

signed char c = 255;

基本型のサイズを判別するために、Bug Finder では [ターゲット プロセッサ タイプ] (-target) の指定が使用されます。

リスク

定数のオーバーフローの既定の動作は、コンパイルやプラットフォームによって異なる場合があります。定数のオーバーフローを維持するとコードの移植性が低くなる可能性があります。

コンパイラでオーバーフローした定数が警告を伴ってラップ アラウンドされる場合でも、ラップ アラウンドの動作は意図されたものではなく、予期しない結果を引き起こす可能性があります。

修正方法

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

例 - マクロ展開での定数のオーバーフロー
#define MAX_UNSIGNED_CHAR 255 
#define MAX_SIGNED_CHAR 127

void main() {
    char c1 = MAX_UNSIGNED_CHAR;
    char c2 = MAX_SIGNED_CHAR+1;
}

この例では、1 つ以上のマクロを使用するとオーバーフローが起こるため、マクロに欠陥が表示されます。この欠陥を再現するには、解析オプション [ターゲット プロセッサ タイプ] (-target) を使用します。ここで、char は、既定では符号付きになります。

修正 — 別のデータ型を使用

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

#define MAX_UNSIGNED_CHAR 255 
#define MAX_SIGNED_CHAR 127

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

チェック情報

決定可能性:決定不可能

バージョン履歴

R2019a で導入


1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.