我在很多地方(musl 邮件列表、macOS 论坛等)都听说过brk()
是sbrk()
不安全的。其中很多地方要么根本不解释,要么解释的很模糊。例如,此链接指出“这些功能从根本上被破坏”,并继续说malloc
和sbrk
子系统完全被破坏,它们破坏了堆等。
我的问题是:为什么会这样?如果malloc
以这样的方式使用它分配一个sbrk
足够大的内存块来平息或大大减少对进一步分配的需求,那么使用起来不应该sbrk
并且brk
完全安全吗?
这是我的sbrk
and实现brk
:
sbrk
:
#include <unistd.h>
#include <stddef.h>
void *sbrk(intptr_t inc)
{
intptr_t curbrk = syscall(SYS_brk, NULL);
if( inc == 0 ) goto ret;
if( curbrk < 0 ) return (void *)-1;
curbrk((void *)(curbrk+inc));
ret:
return (void *)curbrk;
}
brk
:
#include <unistd.h>
intptr_t brk(void *ptr)
{
if( (void *)syscall(SYS_brk, ptr) != ptr )
return -1;
else
return 0;
}