malloc中的SIGSEGV?

时间:2011-10-21 06:12:14

标签: c linux

任何人都可以提供一些示例代码,使malloc信号成为sigsegv吗? 谷歌搜索说,堆腐败可能导致malloc中的sigsegv,但我无法理解。

非常感谢。

2 个答案:

答案 0 :(得分:2)

这有可能导致问题,但可能是free()而不是malloc()给你SIGSEGV。

 void *vp = malloc(1024);
 memset((char *)vp - 32, 0, 1024);
 free(vp);

您可能会在malloc()中遇到崩溃:

 enum { SZ_ALLOC = 1024, SZ_PREFIX = 32, SZ_SUFFIX = 32, SET_BYTE = '\0' };

 void *v1 = malloc(SZ_ALLOC);
 free(v1);
 memset((char *)v1 - SZ_PREFIX, SET_BYTE, SZ_ALLOC + SZ_PREFIX + SZ_SUFFIX);
 void *v2 = malloc(SZ_ALLOC);

这会在分配的内存之前和之后覆盖32个字节,如果连续存储将分配内存(通常是这种情况),这可能会破坏任何控制信息。使用零可以最大化您获得空指针访问的机会。您可以选择一个替代值来覆盖数据,这可能意味着大小大于零(其中零大小可能会保护您免受内存访问)。

当然,这都是完全未定义的行为;您可能会在memset()中遇到崩溃,或者您可能根本不会遇到崩溃。

答案 1 :(得分:1)

试试这个:

void **x = malloc(1000);
free(x);
x[0] = x[1] = "hello";
x = malloc(1000);

它通过破坏链接的空闲列表来工作,刚释放的块是指向不可修改的内存的成员。当malloc尝试从此列表中出列时发生崩溃。它几乎肯定适用于mallocfree为O(1)的任何实现。