メインコンテンツ

AUTOSAR C++14 Rule A27-0-3

Alternate input and output operations on a file stream shall not be used without an intervening flush or positioning call

説明

ルール定義

Alternate input and output operations on a file stream shall not be used without an intervening flush or positioning call.

根拠

ファイル ストリームを使用した入出力の交互実行で、読み取り操作と書き込み操作の間でストリームの再位置付けステートメントを使用しないと、未定義の動作につながる可能性があります。

std::fstream() などの関数を使用してファイル ストリームを開くと、次の読み取りまたは書き込み操作が行われるファイル ストリーム内の位置を追跡するために、std::basic_filebuf オブジェクトが作成されます。このオブジェクトの実装には C FILE* ポインターが使用されます。C 標準に従って、単一の FILE* ポインターを使用して、ファイル ストリームにおける入力操作と出力操作の両方を実行できます。ただし、入力操作が後に続く出力操作の前、または出力操作が続く入力操作の前に、まずファイル ストリームでポインターを再位置付けする必要があります。そのようにしないと、未定義の動作につながる可能性があります。

Polyspace 実装

ファイル ストリームにおける入力操作の前に出力操作を行う場合、または出力操作の前に入力操作を行う場合、操作の間でファイル ストリームの再位置づけが行われていないと、ルール チェッカーは違反を報告します。チェッカーは次のいずれかのファイル ストリーム表現を使用して、ファイル操作における問題を検出します。

  • FILE* ポインター (fopen() などの関数を使用して開かれたファイルの場合)

  • std::basic_filebuf オブジェクト (std::fstream() などの関数を使用して開かれたファイルの場合)

次のいずれかの方法で、ファイル ストリーム内の位置をリセットします。

  • FILE* ポインターの場合は、出力操作と入力操作の間で fseek()fsetpos() などのファイル位置付け関数を使用するか、出力操作とそれに続く入力操作の間で関数 fflush() を呼び出して出力バッファーをフラッシュします。

  • std::basic_filebuf オブジェクトの場合は、seekp()seekg() などのファイル ストリーム位置付けメソッドを使用します。

トラブルシューティング

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

すべて展開する

この例では、関数 getSomeLineFromFile() が入力操作と出力操作の両方に対してファイル ストリーム オブジェクト file を使用します。

  • << 演算子が入力操作を行います。

  • 関数 std::getline() が出力操作を行います。

ただし、出力操作と入力操作の間でファイル ストリームの再位置付け操作が行われません。関数 getOtherLineFromFile() はこの問題を修正するために、seekg() メソッドを使用してファイル ストリームを再位置付けします。

#include <fstream>
#include <string>

void getSomeLineFromFile() {
    std::fstream file { "hello.txt" };
    file << "Some line\n" << std::flush; 
    std::string line {};
    std::getline( file, line );          //Noncompliant
}

void getOtherLineFromFile() {
    std::fstream file { "hello.txt" };
    file << "Some line\n" << std::flush; 
    std::string line {};
    file.seekg( 0, std::ios_base::beg );
    std::getline( file, line );         //Compliant
}

チェック情報

グループ: Input/output library
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入

すべて展開する