为单元测试包装open()将使gcov无法打开gcda文件
我正在为一些C程序实现使用测试。为此,我使用GCC的为单元测试包装open()将使gcov无法打开gcda文件,c,unit-testing,gcc,gcov,C,Unit Testing,Gcc,Gcov,我正在为一些C程序实现使用测试。为此,我使用GCC的-Wl,--wrap=open模拟stdlib的open()函数,并检查是否使用正确的选项调用了它 然而,在这样做时,gcov在编写其.gcda文件时遇到了一些问题。我猜我定义的mock不仅被我的测试使用,也被gcov使用。下面是一个小示例,说明了如何重现: #include <stdio.h> int __wrap_open(const char *path, int flags, int mode) { printf(
-Wl,--wrap=open
模拟stdlib的open()
函数,并检查是否使用正确的选项调用了它
然而,在这样做时,gcov在编写其.gcda
文件时遇到了一些问题。我猜我定义的mock不仅被我的测试使用,也被gcov使用。下面是一个小示例,说明了如何重现:
#include <stdio.h>
int __wrap_open(const char *path, int flags, int mode)
{
printf("hello from __wrap_open\n");
return -1;
}
int main(void)
{
return 0;
}
是否有一种方法可以模拟
open()
函数进行单元测试,并能够使用gcov生成代码覆盖率数据?也许有一种方法可以告诉gcov使用\uu real\u open()
?实现这一点的简单方法是:
- 检查传递到
的文件路径是否是您的分析文件open()
- 如果是,请将调用传递到
\uuuu real\u open()
使用这种方法,您当然可以轻松添加更多不应被篡改的文件。这很有效!我必须添加
\uuu real\u open()
声明才能调用它。你能在你的回答中加上这个,并在操作符周围加上一些空格,这样我就可以把它标记为可接受的答案吗?@MicroJoe没问题,如果你觉得更好的话;)另外,如果我也将close()包装起来,我应该担心它吗?实际上,我正在包装open()和close(),但实际上并没有关闭\uuuwrap\uclose
中的任何内容。我的覆盖率报告在不调用\uuu real\u close
的情况下运行良好,我猜操作系统将在退出时自动关闭文件描述符?@MicroJoe是的,这是正确的。但你为什么要把自己裹得紧紧的呢?包装的close做什么呢?@MicroJoe好的,但是您也可以在那里调用uu real_close(),使用给定的filedescriptor句柄,这可能不会有什么影响
$ ./a.out
hello from __wrap_open
hello from __wrap_open
profiling:/home/romain/wrap-bug/main.gcda:Cannot open
int __real_open(const char *path, int flags, int mode);
int __wrap_open(const char *path, int flags, int mode)
{
if (strlen(path) > 5 && !strcmp(path + strlen(path) - 5, ".gcda"))
return __real_open(path, flags, mode);
printf("hello from __wrap_open\n");
return -1;
}