このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
非有限の浮動小数点を検討 (-allow-non-finite-floats
)
無限大と NaN を組み込んだ解析モードの有効化
説明
浮動小数点演算に対して、無限大と NaN を組み込んだ解析モードを有効にします。
オプションの設定
以下のいずれかの方法を使用してオプションを設定します。
Polyspace® ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト構成で [チェック動作] ノードを選択してから、このオプションを選択します。
Polyspace Platform ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト構成の [静的解析] タブで [実行時エラー] 、 [チェック動作] ノードを選択してから、このオプションを選択します。
コマンド ラインとオプション ファイル: オプション
-allow-non-finite-floats
を使用します。コマンド ライン情報を参照してください。
このオプションを使用する理由
既定では、解析に無限大と NaN は組み込まれていません。たとえば、ゼロ除算が発生し結果が無限大になる可能性を考慮しない実行スレッドは、解析によって終了されます。
isinf
または isnan
などの関数を使用してコードで無限大と NaN を考慮する場合は、このオプションを設定します。このオプションを設定し、たとえば、ゼロ除算が発生すると、実行スレッドはこの除算結果を無限大として続行します。
コードで無限大と NaN を考慮していることが確実な場合は、このオプションを単独で設定します。このオプションを単独で使用すると、浮動小数点演算の数値チェックの多くが事実上に無効になります。ほとんどの場合無限大と NaN を考慮しているとしても、すべての状況で考慮されるかどうかが不明瞭な場合は、以下の追加オプションを設定します。
無限大 (-check-infinite)
:warn-first
を使用します。NaN (-check-nan)
:warn-first
を使用します。
解析で、isinf
または isnan
を使用した比較にデッド コードのフラグが設定される場合、このオプションを使用します。既定では、Bug Finder 解析に無限大と NaN は組み込まれていません。
設定
オン
解析で無限大と NaN が許容されます。このモードでは、たとえば次のようになります。
解析では、浮動小数点演算の結果が無限大や NaN になる可能性があると想定されます。
オプション
[無限大] (-check-infinite)
および[NaN] (-check-nan)
を使用して、結果が非有限になる演算を強調表示したり、結果が非有限になった時点で実行スレッドを停止したりできます。これらのオプションは、Bug Finder 解析には使用できません。解析では、値が不明な浮動小数点変数について、無限大と NaN を含む、その型に許容される任意の値を取る可能性があると想定されます。値が不明な浮動小数点変数には、スタブ関数の volatile 変数や戻り値が含まれます。
オフ (既定の設定)
解析で無限大と NaN が許容されません。このモードでは、たとえば次のようになります。
Code Prover 解析では、すべての実行パスで結果が必ず無限大または NaN になる浮動小数点演算に対してはレッド チェックが生成されます。結果が無限大または NaN になる可能性がある浮動小数点演算に対してはオレンジ チェックが生成されます。
Code Prover 解析では、値が不明な浮動小数点変数について、全範囲のうちの有限の値になると想定されます。
Bug Finder 解析では、
isinf
を使用した無限大を含む比較がデッド コードとして示されます。
ヒント
IEEE® 754 規格では、コードを中止せずに特定の数値の例外を処理できるように、無限大や
NaN
などの特殊な量が許可されています。C 標準では、一部の実装で無限大とNaN
がサポートされています。コンパイラで無限大と
NaN
がサポートされており、それらをコードで明示的に考慮する場合は、このオプションを使用して検証でも許容されるようにします。たとえば、除算の結果が無限大になる場合のアクションとして、コードで別のアクションを指定しているとします。この場合、結果が無限大になる除算演算を検証で強調表示する必要はありません。
コンパイラで無限大と
NaN
がサポートされており、それらをコードで明示的に考慮するかどうかわからない場合は、このオプションを使用して無限大とNaN
を検証に組み込むようにします。オプション-check-nan
および-check-infinite
で引数warn
を使用すると、結果が無限大およびNaN
になる演算を検証で強調表示し、実行スレッドは中止しないように設定できます。これらのオプションは、Bug Finder 解析には使用できません。
Code Prover 解析を実行して、このオプションを使用する場合、オーバーフロー、ゼロ除算、およびその他の数値的なランタイム エラーのチェッカーが無効になります。数値チェックを参照してください。
Bug Finder 解析を実行して、このオプションを使用すると、次のようになります。
以下のチェッカーは無効になっています。
Bug Finder 欠陥:
浮動小数点変換のオーバーフロー
、浮動小数点数のゼロ除算
、標準ライブラリの浮動小数点ルーチンの無効な使用
、浮動小数点のオーバーフロー
。CERT C ルールと推奨事項:
CERT C:Rule FLP34-C
、CERT C:Rule FLP32-C
、CERT C:Rec.FLP03-C
、CERT C:Rec.FLP06-C
。CERT C++ ルール:
CERT C++:FLP34-C
、CERT C++:FLP32-C
。AUTOSAR C++14 Rule:
AUTOSAR C++14 Rule A0-4-4
。MISRA C:2004 Rule:MISRA C:2004 Rule 20.3。
これらのチェッカーは違反を少なく表示する可能性があります。
MISRA C:2012 Dir 4.1
これらのチェッカーは誤検知を表示する可能性があります。
等号演算子による浮動小数点の比較
、AUTOSAR C++14 Rule M6-2-2
、MISRA C:2012 Dir 1.1
。
このオプションを選択すると、コード内の Code Prover チェックの数やタイプが変更される場合があります。
たとえば、以下の例では、オプションを選択すると、結果でレッド チェックが 1 つ減り、グリーン チェックが 3 つ増えます。
無限大と NaN を許容しない 無限大と NaN を許容する Code Prover で [ゼロ除算] エラーが生成され、検証が停止します。
double func(void) { double x=1.0/0.0; double y=1.0/x; double z=x-x; return z; }
このオプションを選択した場合、Code Prover で [ゼロ除算] エラーがチェックされません。
double func(void) { double x=1.0/0.0; double y=1.0/x; double z=x-x; return z; }
解析では、ゼロ除算が次のような結果になると想定されます。
x
の値がInf
になるy
の値が 0.0 になるz
の値がNaN
になる
Polyspace ユーザー インターフェイスで解析結果の
y
およびz
にカーソルを置くと、ツールヒントに非有限値Inf
およびNaN
がそれぞれ表示されます。
コマンド ライン情報
パラメーター: -allow-non-finite-floats |
既定値: オフ |
例 (Bug Finder): polyspace-bug-finder -sources |
例 (Code Prover): polyspace-code-prover -sources |
例 (Bug Finder Server): polyspace-bug-finder-server -sources |
例 (Code Prover Server): polyspace-code-prover-server -sources |
バージョン履歴
R2016a で導入