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中,未调用模拟函数.我正在寻找一个解决方案,我可以模拟函数,甚至调用者和被调用的函数在同一个文件中.
你不能。
从链接器文档中,
--wrap symbol 对符号使用包装函数。任何未定义的符号引用都将解析为 __wrap_symbol。对 __real_symbol 的任何未定义引用都将解析为符号。这可用于为系统功能提供包装器。包装函数应称为 __wrap_symbol。如果它想调用系统函数,它应该调用__real_symbol。这是一个简单的例子:
Run Code Online (Sandbox Code Playgroud)void * __wrap_malloc (int c) { printf ("malloc called with %ld\n", c); return __real_malloc (c); }如果使用 --wrap malloc 将其他代码链接到此文件,则所有对 malloc 的调用都将调用函数 __wrap_malloc。__wrap_malloc 中对 __real_malloc 的调用将调用真正的 malloc 函数。您可能还希望提供 __real_malloc 函数,以便没有 --wrap 选项的链接也会成功。
这是最重要的部分......
如果这样做,则不应将 __real_malloc 的定义与 __wrap_malloc 放在同一文件中;如果这样做,汇编器可能会在链接器有机会将调用包装到 malloc 之前解析该调用。
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |