メインコンテンツ

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

MISRA C:2012 Rule 22.9

The value of errno shall be tested against zero after calling an errno-setting function

説明

ルール定義

The value of errno shall be tested against zero after calling an errno-setting function. 1

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

根拠

errno を設定する関数の呼び出し中にエラーが発生すると、その関数は errno に非ゼロ値を書き込みます。そうでない場合、errno は変更されません。

errno が非ゼロの場合、その関数が正しい戻り値を返す可能性が低くなります。この戻り値を使用する前に、errno が非ゼロ値かどうかをテストしなければなりません。

Errno を設定する関数は以下のとおりです。

  • ftellfgetposfgetwc および関連する関数。

  • strtoimaxstrtol および関連する関数。

    wcstoimaxwcstol などのワイド文字の等価な関数も対象になります。

Polyspace 実装

コードで、errno を設定する関数を呼び出しているが、別の関数を呼び出す前に errno が 0 であるかを確認しない場合、Polyspace® はこのルールの違反を報告します。

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

トラブルシューティング

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

すべて展開する

#include <stdlib.h>
#include <errno.h>

void func(void);
double val = 0.0;

void f1 ( void )
{
  errno = 0;
  val = strtod ( "1.0", NULL ); /* Non-compliant */
  func ();

  if ( 0 != errno )
    {
    }

  errno = 0;
  val = strtod ( "1.0", NULL ); /* Compliant */
  if ( 0 == errno ) 
    {
      func();
    }
}

この例では、strtod を最初に呼び出した直後に errno をチェックしていないため、ルールに違反します。代わりに、2 つ目の関数 func を呼び出しています。func では、グローバル変数 val の値を使用する可能性があります。strtod の呼び出し中にエラーが発生している場合、この値は正しくない可能性があります。

strtod の戻り値を使用する可能性がある操作の前に errno をチェックすると、ルールに違反しません。

チェック情報

グループ: 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.