c - C 中 fread() 错误的测试用例

标签 c testing continuous-integration automated-tests stdio

在我维护的一个 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/

相关文章:

c - 相同的多线程代码在不同处理器上的时间差异?

testing - 是否可以从数据文件传递对象存储库中 HTTP 正文中的动态元素?

sql-server - 将多个 dacpac 文件部署到单个数据库

bash - 是否可以在后台执行多个命令,但等待所有结果并在命令失败时使脚本失败

c - 仅在第一次调用函数时在函数内部进行 fork()

c - 为什么 OpenMP 可以加速单次迭代循环?

python-3.x - 对使用上下文管理器的方法进行单元测试

c# - NUnit 未运行套件测试

python - 我应该使用哪个版本的 cloudshell-shell 和 cloudshell-shell-core?

我可以使用标记粘贴来处理编译时命名吗?