How can malloc() cause a SIGSEGV?
c, gdb, malloc, segmentation-fault
Solution
`malloc` can segfault for example when the heap is corrupted. Check that you are not writing anything beyond the bounds of any previous allocation.
Problem
I have an odd bug in my program, it appears to me that malloc() is causing a SIGSEGV, which as far as my understanding goes does not make any sense. I am using a library called simclist for dynamic lists. Here is a struct that is referenced later: ``` typedef struct { int msgid; int status; void* udata; list_t queue; } msg_t; ``` And here is the code: ``` msg_t* msg = (msg_t*) malloc( sizeof( msg_t ) ); msg->msgid = msgid; msg->status = MSG_STAT_NEW; msg->udata = udata; list_init( &msg->queue ); ``` `list_init` is where the program fails, here is the code for list_init: ``` /* list initialization */ int list_init(list_t *restrict l) { if (l == NULL) return -1; srandom((unsigned long)time(NULL)); l->numels = 0; /* head/tail sentinels and mid pointer */ l->head_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); l->tail_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); l->head_sentinel->next = l->tail_sentinel; l->tail_sentinel->prev = l->head_sentinel; l->head_sentinel->prev = l->tail_sentinel->next = l->mid = NULL; l->head_sentinel->data = l->tail_sentinel->data = NULL; /* iteration attributes */ l->iter_active = 0; l->iter_pos = 0; l->iter_curentry = NULL; /* free-list attributes */ l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * sizeof(struct list_entry_s *)); l->spareelsnum = 0; #ifdef SIMCLIST_WITH_THREADS l->threadcount = 0; #endif list_attributes_setdefaults(l); assert(list_repOk(l)); assert(list_attrOk(l)); return 0; } ``` the line `l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS *` is where the SIGSEGV is caused according to the stack trace. I am using gdb/nemiver for debugging but am at a loss. The first time this function is called it works fine but it always fails the second time. How can malloc() cause a SIGSEGV? This is the stack trace: ``` #0 ?? () at :0 #1 malloc () at :0 #2 list_init (l=0x104f290) at src/simclist.c:205 #3 msg_new (msg_switch=0x1050dc0, msgid=8, udata=0x0) at src/msg_switch.c:218 #4 exread (sockfd=8, conn_info=0x104e0e0) at src/zimr-proxy/main.c:504 #5 zfd_select (tv_sec=0) at src/zfildes.c:124 #6 main (argc=3, argv=0x7fffcabe44f8) at src/zimr-proxy/main.c:210 ``` Any help or insight is very appreciated!