在我维护的一个 C 应用程序中,
有许多对 fread()
的调用。
检查返回值读取的字节数,
并在到达 0
时停止,
表示已到达文件/流结尾。
现在,这并不完全正确。
如果发生错误,fread()
也可能返回 0
。
例如,检查该条件的一种方法是调用 feof()
。
我当然可以在调用 fread()
的任何地方添加所有这些测试。但这不是重点:这将是某种“盲目修复”。我需要一个测试用例来观察和重复问题,并将修正作为 CI 测试的一部分进行观察。
到目前为止,我还没有找到。
我对 fwrite()
的问题要少得多,它相对容易产生问题,但是对于 fread()
,我还没有找到可靠的方法来测试问题 < em>也不会影响 fopen()
,这是一个完全不同的情况,已经过很好的测试。
欢迎任何建议。
最佳答案
我看不到可靠的标准解决方案。
C 没有提供明确的方法来模拟错误,甚至没有设置 FILE*
错误指示符。
测试代码可以在特定于编译器/平台的基础上设置FILE
的错误指示符。 也许就像
#define SIM_ERROR(stream, ret) \
while (1) {if (my_rand()==0) { (stream)_flags |= __SERR; (ret) = 0;} }
ret = fread(ptr, size, nmemb, stream);
SIM_ERROR(stream, ret);
或者,一种稍微更便携的方法。在测试期间,代码可以使用自己的函数作为标准库函数的临时替代品,从而导致错误。
int my_error_indicator = 0;
intptr_t my_stream = 0;
size_t my_fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream) {
if (rand() == 0) {
my_error_indicator = 1;
my_stream = (intptr_t) stream;
return 0;
}
return fread(ptr, size, nmemb, stream);
}
int my_ferror(FILE *stream) {
if (my_error_indicator && (intptr_t) stream == my_stream) {
return my_error_indicator;
}
return ferror(stream);
}
void my_clearerr(FILE *stream) {
if ((intptr_t) stream == my_stream) {
my_stream = NULL;
my_error_indicator = 0;
}
clearerr(stream);
}
#define fread my_fread
#define ferror my_ferror
#define clearerr my_clearerr
替换 fclose()、rewind()
也是需要的,因为它们取消分配和/或清除错误指示器。
此处不处理多个流上的错误。
关于c - C 中 fread() 错误的测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392410/