CERT.FIO.NO_FLUSH

フラッシュまたは位置調整の関数呼び出しの欠如

ストリームから交互に入力と出力を行う場合は、ファイル位置調整関数 (fflush、fseek、fsetpos、または rewind) のフラッシュの呼び出しに介在する必要があります。

脆弱性とリスク

fflush()、fseek()、fsetpos()、または rewind() の呼び出しに介在することなく、そのストリームへの出力の直後にストリームから入力を受信する場合、またはその逆の場合でも、未定義の動作が発生する可能性があります。

軽減と防止

ストリームからの入力の直後にストリームへの出力が続く場合、またはその逆の場合でも、介在するフラッシュまたは位置調整関数の呼び出しを追加します。

脆弱コード例

コピー
   #include <cstdio>
   void func(const char *file_name) {
   char buffer[500];
   char w_data[500];
     FILE *file = fopen(file_name, "a + ");
     fread(buffer, 1, 100, file);
     fwrite(w_data, 1, 100, file); //@ CERT.FIO.NO_FLUSH
     fclose(file);
   }

この非準拠の例では、fread と fwrite の間に位置調整関数の呼び出しがないため、Klocwork は、fwrite が呼び出されるときに、7 行目で CERT.FIO.NO_FLUSH の欠陥を報告します。

修正コード例

コピー
   #include <cstdio>
   void func(const char *file_name) {
   char buffer[500];
   char w_data[500];
     FILE *file = fopen(file_name, "a + ");
     fread(buffer, 1, 100, file);
     fseek(file, 0L, SEEK_SET);
     fwrite(w_data, 1, 100, file);  //@no CERT.FIO.NO_FLUSH
     fclose(file);
  }

この修正された例では、fread と fwrite の間で fseek が呼び出されるため、Klocwork は欠陥を報告しません。