用C语言模拟库函数

用C语言模拟库函数,c,testing,linker,mocking,C,Testing,Linker,Mocking,我想模拟c库的函数,比如malloc,而不需要对原始源文件(使用malloc的源文件)做太多修改 我试着包括一个头文件“mock.h”,比如 给出了部分解决方案:使用链接器在符号上创建别名。我现在可以使用-Xlinker--defsym“malloc”=“my\u mock\u malloc”进行编译。问题是,我所有的.o文件都是使用此选项链接的,因此我使用的单元测试框架()受到模拟的影响(因此,当我使模拟函数返回NULL时,它接收的是SIGSEGV) 有没有办法在本地执行这样的符号别名,这样我

我想模拟c库的函数,比如
malloc
,而不需要对原始源文件(使用malloc的源文件)做太多修改

我试着包括一个头文件“mock.h”,比如

给出了部分解决方案:使用链接器在符号上创建别名。我现在可以使用
-Xlinker--defsym“malloc”=“my\u mock\u malloc”
进行编译。问题是,我所有的
.o
文件都是使用此选项链接的,因此我使用的单元测试框架()受到模拟的影响(因此,当我使模拟函数返回
NULL
时,它接收的是SIGSEGV)


有没有办法在本地执行这样的符号别名,这样我就可以让我的测试框架使用真正的malloc?Os有比这个更好的解决方案吗?

我找到了一个解决方案,它包括一个头文件
mock.h
类似的文件

#ifndef MOCK_H_
# define MOCK_H_
# ifdef MOCK_MODE

#  include <sys/types.h>

extern void *my_mock_malloc(size_t n);
#  define malloc(x) (my_mock_malloc(x))

# endif /* MOCK_MODE */
#endif /* !MOCK_H_ */
\ifndef MOCK\H_
#定义MOCK_H_
#ifdef模拟_模式
#包括
外部无效*my_mock_malloc(尺寸);
#定义malloc(x)(my_mock_malloc(x))
#endif/*模拟_模式*/
#endif/*!模仿*/

但我仍然对另一种解决方案感到好奇。

您可以这样做:

#include <stdio.h>
#include <stdlib.h>

#define malloc my_malloc

void *my_malloc(size_t size) {
    printf ("Called my_malloc\n");
    return NULL;
}

int main(void) {
    char * array = malloc(100);
    return 0;
}

大多数C语言实现都将libc的所有符号指定为弱符号,也就是说,您可以根据需要重写它们。试试看!您可以编写自己的名为
malloc
的函数,它会自动替换提供的库
malloc
。请查看您的平台文档,因为您还需要实现另外两个功能(如
free
realloc
calloc
,等等),才能完成
malloc
更换。

虽然不是您问题的完整答案,您会发现CppUTest对于测试C代码也非常有用,它在模拟功能中包含了大多数malloc/free库,允许您控制malloc失败等等。它还非常适合调试内存分配问题,因为它使用调试分配器

但是,我发现框架文档有点缺乏细节和示例

几年前,当我“愤怒地”使用该框架时,我发现有必要实现我自己的模拟strdup()函数,这是我在CppUTest源代码中实现的


我还添加了DeathHandler功能,以帮助在测试期间捕获和诊断SEGFULTS。

我尝试从我的回答中删除
#define
,并将函数重命名为
malloc
。它编译得很干净,但是挂起了。您是否也实现了所有其他需要的函数?你在哪个平台上工作?你会在我的回答中看到我做了什么
my_malloc
打印一条消息,说明调用了它,并返回
NULL
。该示例中没有其他需要的函数。当我删除
#include
#define
并将函数重命名为
malloc
时,它已编译但未运行-挂起。这是因为GNUPrintf在内部调用malloc!你会得到一个infimite循环。同样,您也必须重写其他函数,否则会出现weirf行为。啊,我只测试了
#define
,供本地使用。但我想知道为什么
printf
在我的原始答案中起作用(Gme是Gnot Gnu);)
#ifndef MOCK_H_
# define MOCK_H_
# ifdef MOCK_MODE

#  include <sys/types.h>

extern void *my_mock_malloc(size_t n);
#  define malloc(x) (my_mock_malloc(x))

# endif /* MOCK_MODE */
#endif /* !MOCK_H_ */
#include <stdio.h>
#include <stdlib.h>

#define malloc my_malloc

void *my_malloc(size_t size) {
    printf ("Called my_malloc\n");
    return NULL;
}

int main(void) {
    char * array = malloc(100);
    return 0;
}
Called my_malloc