このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
符号なし整数定数のオーバーフロー
符号なし整数データ型の範囲外にある定数
説明
この欠陥は、次の場合に発生します。
コンパイル時の定数がその値を格納できないデータ型の符号なし整数変数に代入された。
enum
の潜在型に収まらないenum
値を使用した (かつ、潜在型が符号なしであった)。
n
ビット符号なし整数は、範囲 [0, 2n
-1] 内の値を保持します。たとえば、c
は 8 ビットの符号なし char
型の変数であるため、値 256 を保持できません。
unsigned char c = 256;
この欠陥チェッカーは、次のオプションに依存します。
基本型のサイズを判別するために、Bug Finder では
[ターゲット プロセッサ タイプ] (-target)
の指定が使用されます。列挙値の潜在型を判別するために、Bug Finder では
[列挙型の定義] (-enum-type-definition)
の指定が使用されます。
この欠陥は、次の状況では発生しません。
const
変数から新しい定数を作成する (特定のコンパイラのみ)。コンパイラによって、コンパイル時定数の定義方法は異なります。次のコードでは、
c+1u
は GCC コンパイラではコンパイル時定数とみなされますが、標準 C コンパイラでは見なされません。const uint16_t c = 0xffffu; uint16_t y = c + 1u;
y
でのこのチェックの違反が検出されるかどうかは、コンパイラによって異なります。ビット
NOT
演算。Polyspace® では、ビット
NOT
演算の実行時にこの違反が報告されません。
リスク
C 標準では、オーバーフローした符号なし整数はラップされなければなりません (たとえば、C11 規格の節 6.2.5 を参照)。ただし、そのラップ アラウンド動作は意図されていないことがあり、予期しない結果を引き起こす可能性があります。
修正方法
定数値が意図したものかどうかをチェックします。値が正しい場合は、より大きいデータ型をその変数に使用します。
例
結果情報
グループ: 数値 |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: UINT_CONSTANT_OVFL |
影響度: Low |
バージョン履歴
R2018b で導入