任何人都可以提供一些示例代码,使malloc信号成为sigsegv吗? 谷歌搜索说,堆腐败可能导致malloc中的sigsegv,但我无法理解。
非常感谢。
答案 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
尝试从此列表中出列时发生崩溃。它几乎肯定适用于malloc
和free
为O(1)的任何实现。