メインコンテンツ

MISRA C:2012 Rule 22.7

The macro EOF shall only be compared with the unmodified return value from any Standard Library function capable of returning EOF

説明

ルール定義

The macro EOF shall only be compared with the unmodified return value from any Standard Library function capable of returning EOF. 1

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

根拠

標準ライブラリ関数から返される EOF を別の型に変換すると、この戻り値を有効な文字コードと区別できなくなる可能性があります。そのような場合、変換後の値を EOF に対してテストしても、ファイルの終わりに達したかどうかや、エラーが発生したかどうかを確実に判断することはできません。

ファイルの終わりを確実に判断するには、関数 feof() または ferror() を使用します。

Polyspace 実装

Polyspace® は、次のイベントが順番に発生する場合にこのルールの違反を報告します。

  • EOF を返すことができる標準ライブラリ関数が呼び出される。

  • この関数の戻り値が別の型に変換される。この変換が複数のステップにわたって発生する可能性がある。

  • 変換後の戻り値がマクロ EOF と比較される。

トラブルシューティング

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

すべて展開する

#include <stdio.h>
#include <stdint.h>

void f1(void)
{
    char ch;
    ch = (char) getchar();
    if (EOF != (int32_t) ch) {    /* Noncompliant */
    }
}

void f2(void)
{
    char ch;
    ch = (char) getchar();
    if (!feof(stdin)) {           /* Compliant */
    }
}

void f3(void)
{
    int32_t i_ch;
    i_ch = getchar();
    if (EOF != i_ch) {            /* Compliant */
        char ch;
        ch = (char) i_ch;
    }
}

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

  • 関数 f1() 内のテストは準拠していません。EOF をチェックする前に、getchar() の戻り値をより範囲が狭い型にキャストしているため、信頼性がありません。

  • 関数 f2() 内のテストは準拠しています。これは、getchar() の戻り値に型変換を適用した後に、feof() を使用して EOF をチェックしています。

  • 関数 f3() 内のテストは準拠しています。EOF と比較するときに、変換されていない getchar() の戻り値を使用しているため、信頼できます。

チェック情報

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