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 未报告缺陷。