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