メインコンテンツ

浮動小数点数のゼロ除算

浮動小数点数のゼロでの除算

説明

この欠陥は、除算演算の分母がゼロ値の浮動小数点数になる可能性がある場合に発生します。

リスク

ゼロ除算はプログラムをクラッシュさせる可能性があります。

修正方法

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

除算の前に分母がゼロ値かどうかをチェックしてエラーを処理することをお勧めします。次のように除算を直接実行するのは避けます。

res = num/den;
除算を実行する前に分母のゼロ値を処理するライブラリ関数を使用します。
res = div(num, den);

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

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

既定では、Bug Finder 解析は無限大と NaNs を認識しません。結果が無限大および NaNs になる演算には、欠陥としてフラグが設定される可能性があります。コードで無限大および NaN の値を処理するには、オプション [非有限の浮動小数点を検討] (-allow-non-finite-floats) を使用します。

チェッカーの拡張

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

すべて展開する

float fraction(float num)
{
    float denom = 0.0;
    float result = 0.0;

    result = num/denom;

    return result;
}

denom がゼロであるため、num/denom でゼロ除算エラーが発生します。

修正 — 除算の前にチェック
float fraction(float num)
{
    float denom = 0.0;
    float result = 0.0;

    if( ((int)denom) != 0)
        result = num/denom;

    return result;
}

除算の前に、分母がゼロかどうかを確認するためのテストを追加して、除算が実行される前にチェックします。denom が常にゼロである場合は、この修正により Polyspace の結果にデッド コードの欠陥が報告される可能性があります。

修正 — 分母を変更

1 つの修正方法として、denom がゼロでなくなるように分母の値を変更することができます。

float fraction(float num)
{
    float denom = 2.0;
    float result = 0.0;

    result = num/denom;

    return result;
}

結果情報

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

バージョン履歴

R2013b で導入