Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为单元测试包装open()将使gcov无法打开gcda文件_C_Unit Testing_Gcc_Gcov - Fatal编程技术网

为单元测试包装open()将使gcov无法打开gcda文件

为单元测试包装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(

我正在为一些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("hello from __wrap_open\n");
    return -1;
}


int main(void)
{
    return 0;
}

是否有一种方法可以模拟
open()
函数进行单元测试,并能够使用gcov生成代码覆盖率数据?也许有一种方法可以告诉gcov使用
\uu real\u open()

实现这一点的简单方法是:

  • 检查传递到
    open()
    的文件路径是否是您的分析文件
  • 如果是,请将调用传递到
    \uuuu real\u open()
i、 e


使用这种方法,您当然可以轻松添加更多不应被篡改的文件。

这很有效!我必须添加
\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;
}