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