整数定数のオーバーフロー
整数データ型の範囲外にある定数
説明
この欠陥は、次の場合に発生します。
コンパイル時の定数が、その値を格納できないデータ型の符号付き整数変数に代入されている。
代入による定数オーバーフローを参照してください。
enumの潜在型に格納できないenum値が使用されている (かつ、潜在型が符号付きである)。ほとんどの C コンパイラでは、既定で潜在型はsigned intです (C 標準に基づく)。enum 値による定数オーバーフローを参照してください。
オーバーフローを発生させる 2 つの整数定数 (つまり、演算で使用されているデータ型の許容範囲外の値) を含む二項演算が実行されている。整数定数を使用する二項演算では
signed intデータ型が使用されます (ただし、uやLなどの修飾子を使用する場合は、その限りではありません)。二項演算による定数オーバーフローを参照してください。
n ビット符号付き整数は、範囲 [-2n-1, 2n-1-1] 内の値を保持します。たとえば、c は 8 ビットの符号付き char 型の変数であるため、値 255 を保持できません。
signed char c = 255;
この欠陥チェッカーは、次のオプションに依存します。
ターゲット プロセッサ タイプ (-target):基本型のサイズを判別します。Enum 型の定義 (-enum-type-definition):列挙値の潜在型を判別します。コンパイラ (-compiler): コードの解釈に影響を与えます。
この欠陥は、次の状況では発生しません。
const変数から新しい定数を作成する (特定のコンパイラのみ)。コンパイラによって、コンパイル時定数の定義方法は異なります。次のコードに含まれる
c+1は、GCC コンパイラではコンパイル時定数と見なされますが、標準 C コンパイラではそのように見なされません。const int16_t c = 32767; int16_t y = c + 1;
yでのこのチェックの違反が検出されるかどうかは、コンパイラによって異なります。ビット
NOT演算。Polyspace® では、ビット
NOT演算の実行時にこの違反が報告されません。
リスク
定数のオーバーフローの既定の動作は、コンパイルやプラットフォームによって異なる場合があります。定数のオーバーフローを維持するとコードの移植性が低くなる可能性があります。
コンパイラでオーバーフローした定数が警告を伴ってラップ アラウンドされる場合でも、ラップ アラウンドの動作は意図されたものではなく、予期しない結果を引き起こす可能性があります。
修正方法
定数値が意図したものかどうかをチェックします。値が正しい場合は、より大きい可能性のある別のデータ型をその変数に使用します。
例
結果情報
| グループ: 数値 |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: INT_CONSTANT_OVFL |
| 影響度: Medium |
バージョン履歴
R2018b で導入