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® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: Input/output library | 
| カテゴリ: Required、Automated |