Comment peut malloc() à cause d'un SIGSEGV?

J'ai un drôle de bug dans mon programme, il me semble que la fonction malloc() est à l'origine d'un SIGSEGV, qui, autant que ma compréhension va n'a pas de sens. Je suis l'aide d'une bibliothèque appelée simclist pour les listes dynamiques.

Ici est une structure qui est référencé plus tard:

typedef struct {
    int msgid;
    int status;
    void* udata;
    list_t queue;
} msg_t;

Et voici le 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 est où le programme ne parvient pas, voici le code pour 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;
}

la ligne l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * est où le SIGSEGV est causée en fonction de la trace de la pile. Je suis à l'aide de gdb/nemiver pour le débogage, mais je suis à une perte. La première fois que cette fonction est appelée, elle fonctionne très bien mais il échoue toujours la deuxième fois. Comment peut malloc() à cause d'un SIGSEGV?

C'est la trace de la pile:

#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

Toute aide ou idée est très apprécié!

Comment est list_t déclaré?
Comme une note côté, l'appel de srandom() plus d'une fois n'est pas recommandé. Pour éviter à l'avenir de bugs, même dans list_init() est connu pour être appelé qu'une seule fois, vous devez déplacer que le semis à la même place, c'est plus évidemment exécutée une fois comme près de la haut de main().

OriginalL'auteur user19745 | 2009-09-17