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 は欠陥を報告しません。