メインコンテンツ

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

MISRA C:2012 Rule 22.8

The value of errno shall be set to zero prior to a call to an errno-setting-function

説明

ルール定義

The value of errno shall be set to zero prior to a call to an errno-setting-function. 1

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

根拠

errno を設定する関数は、errno を、エラー状態を示す非ゼロの値に設定します。

errno を設定する関数を呼び出す前に errno をゼロに設定していなかった場合、errno を設定する関数を以前に呼び出したときに設定された非ゼロの値が、errno に残っている可能性があります。この場合、errno を使用してエラーを確認すると、最新の呼び出しで発生したエラーであると誤って判断する可能性があります。

errno はプログラム起動時に 0 に設定されますが、エラーの発生後に自動的にリセットされることはありません。必要に応じて、errno を明示的に 0 に設定しなければなりません。

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

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

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

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

Polyspace 実装

最初に以下のいずれかの処理を行わずに、コードで errno を設定する関数を呼び出した場合、Polyspace® はこのルールに対する違反を報告します。

  • errno を 0 に設定する。

  • 条件付きステートメントで errno を 0 と比較し、errno が 0 である分岐で関数を呼び出す。

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

トラブルシューティング

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

すべて展開する

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

double val = 0.0;

void f ( void )
{
    val = strtod("1.0",NULL); /* Non-compliant*/ 
    if ( 0 == errno ) 
    {
        val = strtod("1.0",NULL); /* Compliant - case 1*/
        if ( 0 == errno ) /* Check errno for nonzero values */
        {
        }
    }
    else
    {
        errno = 0;
        val = strtod("1.0",NULL); /* Compliant - case 2*/
        if ( 0 == errno ) /* Check errno for nonzero values */
        {
        }
    }
}

この例では、strtod を呼び出すとき、その呼び出し前に errno をリセットしていないため、ルールに違反します。

次の場合はルールに違反しません。

  • ケース 1: errno を 0 と比較後、if( 0 == errno ) 分岐で strtod を呼び出す場合。

  • ケース 2: errno に明示的に 0 を設定してから strtod を呼び出す場合。

チェック情報

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