一种C程序内存越界调试方法

偶然在ChinaUnix上看到一篇关于程序调试的帖子,里面讨论到了很多调试程序的方法,其中一个方法如下,觉得还不错:

   

      如果别人的程序里malloc很多,不知道哪里有内存越界,
  那就把malloc, free重新定义掉,放在一个头文件里,如mem.h
  用gcc -include mem.h的方式重新编译代码,可以不修改别人的代码来检查内存问题。
 (类似的,还要重定义strdup, realloc等函数)

代码如下:
#define MAGIC_NUM 0x11121314

/* 
   MAGIC_NUM 随机的定一个整数,作为原始内存分配时的附加标志,因此,这个数字尽量设定出现概率小的值,不要用0x00000000这个样出现概率很大的值,用来减少此方法出错的概率,也就是说该方法在很小的概率下还是会有错误的。
*/

static void *my_malloc (size_t size)
{
     int magic = (int) MAGIC_NUM;
     char *p = malloc (size + sizeof (size) + sizeof (magic));

     memcpy (&p[0], &size, sizeof (size_t));
     memcpy (&p[size - sizeof (magic) ], magic, sizeof (magic));

     return (void *) (p + sizeof (size));
}
#undef malloc
#define malloc my_malloc

static void *my_free (void *ptr)
{
    size_t size;
    int magic;
    char *p = (char *) ptr - sizeof (size);
   
    memcpy (&size, p, sizeof (size));
    memcpy (&magic, &p[size + sizeof (size)], sizeof (magic));
   
    if (magic != (int) MAGIC_NUM)
    {
        fprintf (stderr, "Memory overflow!n")
        fflush (stderr);
        while (1);
    }

    free (p);
}
#undef free
#define free my_free
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值