メインコンテンツ

符号変化する整数の変換のオーバーフロー

符号なしの整数と符号付き整数間での変換時のオーバーフロー

説明

この欠陥は、符号なし整数が符号付き整数に変換された場合に発生します。変数に、元の定数と符号ビットの両方を表現するだけの十分なバイト数がない場合、変換はオーバーフローします。

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

修正方法

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

Embedded Coder® を使用する場合、Polyspace® は 32 ビット乗算および除算補助関数を使用する生成コードで、この欠陥の違反を報告することがあります。この欠陥を回避するには、Embedded Coder で設定 [long long のサポート] を有効にします。Support long long (Simulink)を参照してください。

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

チェッカーの拡張

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

すべて展開する

char sign_change(void) {
    unsigned char count = 255;

    return (char)count;
}

return ステートメントで、符号なしの文字変数 count が符号付き文字に変換されています。しかし char は 8 ビットであり、1 ビットは定数の符号、7 ビットは数字の表現に使われます。255 は 8 ビットを使用するため、変換演算によりオーバーフローが起きます。

修正 — 変換の種類を変更

1 つの修正方法として、より大きい整数型を使用することができます。int を使用すると、符号と数値を表現する十分なビット数が得られます。

int sign_change(void) {
    unsigned char count = 255;

    return (int)count;
}

結果情報

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

バージョン履歴

R2013b で導入