c - Linux 中重写 malloc、free 和 calloc 会导致递归

标签 c linux recursion memory-management malloc

我已经重写了Linux平台中的malloccallocfree函数,如下所示:

#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
typedef void* (*MALLOCFN)(size_t);
typedef void* (*CALLOCFN)(size_t, size_t);
typedef void* (*CALLOCFN)(size_t, size_t);
typedef void (*FREEFN)(void *);
MALLOCFN real_malloc = (MALLOCFN) 0;
CALLOCFN real_calloc = (CALLOCFN) 0;
FREEFN real_free = (FREEFN) 0;
void *get_realfn(const char *fnm)
{
  void *pfunc = (void *) NULL;
  printf("searching for original %s\n", fnm);
  pfunc = dlsym(RTLD_NEXT, fnm);
  if (pfunc) printf("found original %s\n", fnm);
  else printf("not found original %s\n", fnm);
  return pfunc;
}
void *malloc(size_t s)
{
  printf("called malloc\n");
  if(real_malloc == NULL) real_malloc = (MALLOCFN) get_realfn("malloc");
  if (real_malloc) return real_malloc(s);
  else return NULL;
}
void *calloc(size_t s1, size_t s2)
{
  printf("called calloc\n");
  if(real_calloc == NULL) real_calloc = (CALLOCFN) get_realfn("calloc");
  if (real_calloc) return real_calloc(s1, s2);
  else return NULL;
}
void free (void * ptr)
{
  printf("called free\n");
  if(real_free == NULL) real_free = (FREEFN) get_realfn("free");
  if (real_free) real_free(ptr);
}
int main()
{
  char * c1 = (char *) malloc(400);
  char * c2 = (char *) malloc(400);
  free(c2); free(c1);
  return 0;
}

C 程序(testalloc.c)是使用 g++ 4.9.2 版本的编译器构建的:

g++ -g testalloc.c  -ldl -o testalloc;

前几行输出如下,进入无限递归并崩溃:

called malloc
searching for original malloc
called free
searching for original free
called free
searching for original free
called free
searching for original free
called free
searching for original free
called free
. . . .

请建议如何避免递归。

最佳答案

printf 函数可以分配内存。因此,当您在未分配“真实”函数指针之前调用 printf 时,它会进入您的插入函数,从而导致无限递归。因此,请勿在插入函数中使用 printf 语句。

如果您确实需要打印某些内容,请使用 syscall(2),这将绕过 stdio 库函数。

#include <sys/syscall.h>

...

syscall(SYS_write, STDOUT_FILENO, "searching for original\n",
                                  sizeof "searching for original\n" - 1);

关于c - Linux 中重写 malloc、free 和 calloc 会导致递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47350055/

相关文章:

将字符串转换为链接列表

linux - 查看堆栈溢出寄存器错误

linux - Linux 上缺少 SFML/OpenGL.hpp

assembly - MAC-1 汇编递归

java - 递归和按引用传递参数

c - 如何编译这个汇编代码?

c - 错误: ordered comparison between pointer and integer ('int' and 'int **' )

c++ - 使用 GCC 构建 Linux 可执行文件

java - 如何在非二叉树的一次递归搜索中获取节点的深度

c - 文字冒险游戏--随机连接房间-C