メインコンテンツ

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

AUTOSAR C++14 Rule A0-4-4

Range, domain and pole errors shall be checked when using math functions

R2022a 以降

説明

ルール定義

Range, domain and pole errors shall be checked when using math functions.

根拠

数学関数を使用する前に、入力引数に潜在的な定義域、範囲、および極エラーがないかどうかをチェックします。

このチェッカーは、関数の引数が許容定義域の範囲外にある場合は定義域エラーを、有限の引数が無限大の結果になる場合は極エラーを、戻り値の制限によって関数の結果を表せない場合は範囲エラーを検索します。

定義域、極、または範囲エラーは、予期しない動作または未定義の動作につながります。

Polyspace 実装

定義域、極、または範囲エラーの結果になる数学関数を呼び出すと、Polyspace® がこの欠陥を報告します。

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

チェッカーの拡張

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

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cmath>

double getSqrt(double val)
{
    return sqrt(val);                       //Noncompliant
}

double getRefinedSqrt(double val)
{
    if (val >= 0)
        return sqrt(val);                   //Compliant
    else
        return 0;
}


void main()
{
    double root, refinedRoot;

    root = getSqrt(4);
    root = getSqrt(-1);

    refinedRoot = getRefinedSqrt(4);
    refinedRoot = getRefinedSqrt(-1);
}

関数 getSqrt 内の数学関数 sqrt によって定義域エラーが発生するため、Polyspace は非準拠としてこれにフラグを設定します。関数 getRefinedSqrt の場合のように変数 val に対するチェックを実行すると、数学関数 sqrt に渡される値が確実に準拠していて、確実に期待されるものとするのに役立ちます。

チェック情報

グループ: 言語に依存しない問題
カテゴリ: Required、Partially automated

バージョン履歴

R2022a で導入