我在很多地方(musl 邮件列表、macOS 论坛等)都听说过brk()是sbrk()不安全的。其中很多地方要么根本不解释,要么解释的很模糊。例如,此链接指出“这些功能从根本上被破坏”,并继续说malloc和sbrk子系统完全被破坏,它们破坏了堆等。
我的问题是:为什么会这样?如果malloc以这样的方式使用它分配一个sbrk足够大的内存块来平息或大大减少对进一步分配的需求,那么使用起来不应该sbrk并且brk完全安全吗?
这是我的sbrkand实现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;
}