メインコンテンツ

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

CERT C++: FLP32-C

Prevent or detect domain and range errors in math functions

説明

ルール定義

数学関数の定義域エラーおよび値域エラーを防止または検出します。1

Polyspace 実装

ルール チェッカーは、"標準ライブラリの浮動小数点ルーチンの無効な使用" をチェックします。

チェッカーの拡張

カスタム ライブラリからの特定の値と関数の無効な使用を原因とする欠陥をチェックするには、このチェッカーを拡張してください。次に例を示します。

すべて展開する

問題

標準ライブラリの浮動小数点ルーチンの無効な使用は、標準ライブラリの浮動小数点関数で無効な引数を使用した場合に発生します。この欠陥では以下が検出されます。

  • 丸めおよび絶対値のルーチン

    ceil, fabs, floor, fmod

  • 分数および除算のルーチン

    fmod, modf

  • 指数および対数のルーチン

    frexp, ldexp, sqrt, pow, exp, log, log10

  • 三角関数ルーチン

    cos, sin, tan, acos, asin, atan, atan2, cosh, sinh, tanh, acosh, asinh, atanh

リスク

標準ライブラリの浮動小数点関数での定義域エラーにより、処理系定義の値が発生します。以降の計算で、この関数の戻り値を使用した場合、予期しない結果になる可能性があります。

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細には欠陥につながる一連のイベントが表示されます。このイベント リストを使用して、関数の引数がどのように無効な値を取得したのかを確認します。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して逆のトレースを行い、これまでの関連するイベントを確認できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈も参照してください。

標準ライブラリの浮動小数点関数を使用する前に定義域エラーを処理することをお勧めします。たとえば、関数 acos を呼び出す前に、引数が [-1.0, 1.0] 内にあるかどうかをチェックしてエラーを処理します。

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

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

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

例 - 逆余弦演算
#include <math.h>

double arccosine(void) {
    double degree = 5.0;
    return acos(degree); //Noncompliant
}

acos への入力値は、区間 [-1,1] 内でなければなりません。この入力引数 degree はこの範囲外です。

修正 — 入力引数を変更

1 つの修正方法として、入力値を指定された範囲に適合するよう変更することができます。この例では、入力値を度からラジアンに変換することでこの欠陥を修正します。

#include <math.h>

double arccosine(void) {
    double degree = 5.0;
    double radian = degree * 3.14159 / 180.;
    return acos(radian);
}

チェック情報

グループ: 49.その他 (MSC)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.