覆盖malloc,free和calloc会导致在Linux中recursion

覆盖malloc,free和calloc会导致在Linux中recursion,第1张

概述覆盖malloc,free和calloc会导致在Linux中recursion

我已经在linux平台上覆盖了函数malloc , calloc和free函数,如下所示:

#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 %sn",fnm); pfunc = dlsym(RTLD_NEXT,fnm); if (pfunc) printf("found original %sn",fnm); else printf("not found original %sn",fnm); return pfunc; } voID *malloc(size_t s) { printf("called mallocn"); 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 callocn"); 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 freen"); 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版本的编译器构build的:

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

显示的输出的前几行如下,它进入无限recursion和崩溃:

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 . . . .

请build议如何避免recursion。

Win32 – 获取主要的Wnd应用程序的句柄

我怎样才能让windows的二进制文件,使非编码器只能得到一个崩溃转储,可以喂给gdb?

如何获取以太网设备列表

现代高分辨率定时器定期调用

如何得到每秒接收和发送的networking字节数用于windows的C ++中的进程(input:进程ID或句柄)?

如何testing我的应用程序是UNICODE兼容与否?

windows堆分配调用堆栈 – 奇怪的调用堆栈

Web应用程序可以访问和修改windowsregistry吗?

如何在windows中使用eclipse编译dlib示例?

64位处理器的uint16_t和unsigned short int incase有什么区别?

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

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

#include <sys/syscall.h> ... syscall(SYS_write,STDOUT_fileNO,"searching for originaln",sizeof "searching for originaln" - 1);

总结

以上是内存溢出为你收集整理的覆盖malloc,free和calloc会导致在Linux中recursion全部内容,希望文章能够帮你解决覆盖malloc,free和calloc会导致在Linux中recursion所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1267020.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存