I've heard in a lot of places (musl mailing list, macOS forums, etc.) that brk()
and sbrk()
are unsafe. Many of these places either don't give explanations at all, or give very vague explanations. For example, this link states that "these functions are fundamentally broken", and goes on to say that the malloc
and sbrk
subsystems are utterly broken, that they ruin the heap, et al.
My question is: Why is this so? If malloc
is used in such a way that it allocates a block of memory with sbrk
large enough to quell or substantially decrease the need for further allocations, then shouldn't sbrk
and brk
be perfectly safe to use?
Here are my implementations of 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;
}