メインコンテンツ

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

MISRA C:2012 Rule 22.10

The value of errno shall only be tested when the last function to be called was an errno-setting function

説明

ルール定義

The value of errno shall only be tested when the last function to be called was an errno-setting function. 1

This rule comes from MISRA C™:2012 Amendment 1.

根拠

errno を設定する関数を除き、その他の関数はエラーで errno を設定するように規格で定められていません。このような関数で errno を設定するかどうかは、実装方法によって異なります。

エラーを検出するため errno のみをチェックする場合、このチェックの妥当性も実装によって異なります。errno の設定を必要としない実装で errno のみをチェックすると、エラー状態を見逃す可能性があります。

errno を設定する関数の一覧については、MISRA C:2012 Rule 22.8を参照してください。

エラーの検出方法の詳細は、その特定の関数のドキュメンテーションを参照してください。

通常、そのような関数はエラーを示すために帯域外エラー インジケーターを返します。次に例を示します。

  • fopen は、エラーが発生すると NULL ポインターを返します。

  • signal は、SIG_ERR エラー インジケーターを返し、errno に正の値を設定します。この関数の戻り値をチェックした後のみ errno をチェックします。

Polyspace 実装

Polyspace® は、errno をチェックしてもエラーがないことが保証されない状況で、errno でエラー状態をチェックした場合に、このルールの違反を報告します。場合によっては、errno をチェックすることによって誤検知につながる可能性があります。

たとえば、次の関数呼び出し後に errno をチェックします。

  • fopen: ISO® 規格に従う場合、この関数はエラーで errno を設定しない可能性があります。

  • atof: ISO 規格に従う場合、この関数は errno を設定しません。

  • signal: この関数が SIG_ERR エラー インジケーターを返す場合のみ、errno の値がエラーを示します。

Polyspace は、C 標準で errno を設定する関数として指定されている関数に対してのみ、このルールの違反を報告します。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#include <stddef.h>
#include <stdlib.h>

typedef double float64_t;

void f(void)
{
    float64_t f64;
    errno = 0;
    f64 = atof("A.12");
    if (0 == errno) { /* Non-compliant */
    }
    errno = 0;
    f64 = strtod("A.12", NULL);
    if (0 == errno) { /* Compliant */
    }
}

この例では以下のようになります。

  • 最初の if ステートメントは、atof がエラーの検出時に errno を設定するかどうかが決まっていないため、準拠していません。f64 は、この if ステートメント内で有効な値をもたない可能性があります。

  • 2 つ目の if ステートメントは、strtoderrno を設定する関数であるため、準拠しています。f64 は、この if ステートメント内で有効な値をもちます。

チェック情報

グループ: Resources
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2017a で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.