如何在同一个文件中定义调用函数时在C中模拟函数?

Gau*_*mar 5 c linux gcc c++11 cmocka

我试图在C中模拟一个函数,当函数及其调用函数在不同的文件中定义时,mocking工作正常.但是当两个函数(函数本身及其调用者)在同一文件中定义时,不会调用模拟函数.


情况1 :

//test.c

#include <stdio.h>

/*mocked function*/
int __wrap_func() {
   printf("Mock function !!!\n"); 
}

/*caller function*/
int myTest() {
  return func();
}

int main() {
    myTest();
    return 0;
}

//file.c
#include<stdio.h>

/*function need to be mocked*/
int func() {
  printf("Original function !!!\n");
    }
Run Code Online (Sandbox Code Playgroud)

案例2:

//test.c
#include <stdio.h>
extern int myTest();
/*mocked function*/
int __wrap_func() {
  printf("Mock function !!!\n");
}

int main() {
    myTest();
}
//file.c
#include<stdio.h>

/*function need to be mocked*/
int func() {
  printf("Original function !!!\n");
}

/*caller function*/
int myTest() {
  return func();
}
Run Code Online (Sandbox Code Playgroud)

代码编译命令:gcc -Wl, - wrap = func test.c file.c

In Case 1 . Mock function !!!
In Case 2 . Original function !!!
Run Code Online (Sandbox Code Playgroud)

在案例2中,未调用模拟函数.我正在寻找一个解决方案,我可以模拟函数,甚至调用者和被调用的函数在同一个文件中.

Maw*_*awg 2

你不能。

链接器文档中,

--wrap symbol 对符号使用包装函数。任何未定义的符号引用都将解析为 __wrap_symbol。对 __real_symbol 的任何未定义引用都将解析为符号。这可用于为系统功能提供包装器。包装函数应称为 __wrap_symbol。如果它想调用系统函数,它应该调用__real_symbol。这是一个简单的例子:

void *
__wrap_malloc (int c)
{
  printf ("malloc called with %ld\n", c);
  return __real_malloc (c);
}
Run Code Online (Sandbox Code Playgroud)

如果使用 --wrap malloc 将其他代码链接到此文件,则所有对 malloc 的调用都将调用函数 __wrap_malloc。__wrap_malloc 中对 __real_malloc 的调用将调用真正的 malloc 函数。您可能还希望提供 __real_malloc 函数,以便没有 --wrap 选项的链接也会成功。

这是最重要的部分......

如果这样做,则不应将 __real_malloc 的定义与 __wrap_malloc 放在同一文件中;如果这样做,汇编器可能会在链接器有机会将调用包装到 malloc 之前解析该调用。