CERT.FIO.NO_POSITIONING
ファイルストリームの出力と入力の間で、位置指定の関数呼び出しがありません
同じファイルストリームに対して入力と出力を交互に行う場合、seekg() や seekp() などの位置指定の関数呼び出しを間に挟む必要があります。
脆弱性とリスク
位置指定の関数呼び出しを挟まずに、ファイルストリームへの出力直後に入力を行ったり、入力直後に出力を行ったりすると、未定義の動作を引き起こすおそれがあります。
軽減と防止
同じファイルストリームの入力と出力操作の間に位置指定の呼び出しを追加します。
脆弱コード例
コピー
#include <fstream>
#include <string>
void f(const std::string &fileName) {
std::fstream file(fileName);
if (!file.is_open()) {
return;
}
file << "Output some data";
std::string str;
file >> str; // CERT.FIO.NO_POSITIONING
}
この非準拠の例では、コードはファイルストリームに書き込み、その後、位置指定の呼び出しを挟まずに同じストリームから読み取ります。そのため、KlocworkはCERT.FIO.NO_POSITIONING という欠陥を報告します。
修正コード例
コピー
#include <fstream>
#include <string>
void f(const std::string &fileName) {
std::fstream file(fileName);
if (!file.is_open()) {
return;
}
file << "Output some data";
file.seekg(0, std::ios::beg);
std::string str;
file >> str; // no CERT.FIO.NO_POSITIONING
}
この修正された例では、seekg() は、読み取りの前にファイルストリームの位置を調整するため、Klocwork は欠陥を報告しません。