メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

負の値のシフト

負の値に対するシフト演算子

説明

この欠陥は、負の値をもつ可能性のある変数に対してビット単位のシフトが使用された場合に発生します。

リスク

負の値に対するシフトでは、数字が負であることを示す符号ビットが上書きされます。このシフト演算は予期しない値になる可能性があります。

修正方法

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

この欠陥を修正するには、ビット単位のシフト演算の前に負の値かどうかをチェックし、適切なエラー処理を実行します。

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

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

チェッカーの拡張

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

すべて展開する

int shifting(int val)
{
    int res = -1;
    return res << val;
}

return ステートメントで、変数 res は特定のビット数だけ左にシフトします。しかし、res は負であるため、シフトにより符号ビットが上書きされる可能性があります。

修正 — データ型を変更

1 つの修正方法として、シフトする変数のデータ型を符号なしに変更することができます。この修正により符号ビットがなくなるため、左へのシフトによって変数の符号が変更されることはありません。

int shifting(int val)
{
    unsigned int res = -1;
    return res << val;
}

結果情報

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

バージョン履歴

R2013b で導入