I am investigating what problems can bt detected with MALLOC_OPTIONS. SEGV occurs even if MALLOC_OPTIONS=G is not specified. Normally, the areas allocated by malloc() are not contiguous. However, after many malloc() operations and not free() these areas, contiguous areas may be allocated. I guessed that MALLOC_OPTIONS=G would be effective in this case, is this correct?
The above estimates are based on the following research: I investigated MALLOC_OPTIONS=G using the following program. $ cat main.c #include <err.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { size_t size; char *buf; size = atoi(argv[1]); if ((buf = malloc(size)) == NULL) err(1, "malloc(%zu) failed", size); buf[size] = 1; /* Writes outside the range allocated by malloc */ free(buf); return (0); } $ cc main.c $ MALLOC_OPTIONS=G ./a.out 4096 zsh: segmentation fault (core dumped) MALLOC_OPTIONS=G ./a.out 4096 The program occurred SEGV. Because, malloc() allocates the requested size + MALLOC_PAGESIZE area using mmap() as below, and the makes the extra MALLOC_PAGESIZE allocated area to be unreadble and unwritable using mprotect(). p = mmap(NULL, size + MALLOC_PAGESIZE, ...); mprotect(p + size, MALLOC_PAGESIZE, PROT_NONE); However, SEGV occurs even if not specify MALLOC_OPTIONS=G. $ ./a.out 4096 zsh: segmentation fault (core dumped) ./a.out 4096 Because, malloc() allocates the requested size as below: p = mmap(NULL, size, ...); Of course, can not read and write to area that exceeded size. -- ASOU Masato