私のプログラムには奇妙なバグがあります。malloc()がSIGSEGVを引き起こしているように見えます。私の理解が行き届かない限り、それは意味をなさないものです。私は動的リストのためにsimclistというライブラリを使用しています。ここで malloc()はどのようにSIGSEGVを引き起こしますか?
は後に参照される構造体である:typedef struct {
int msgid;
int status;
void* udata;
list_t queue;
} msg_t;
そして、ここのコードです:プログラムは失敗したところ
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
があり、ここで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;
}
行l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS *
は、SIGSEGVがt oスタックトレース。私はデバッグにgdb/nemiverを使用していますが、紛失しています。初めてこの関数を呼び出すと正常に動作しますが、常に2回目に失敗します。 malloc()はどのようにSIGSEGVを引き起こしますか?
#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
すべてのヘルプや洞察力が非常に高く評価されています
これは、スタックトレースです!
'list_t'はどのように宣言されていますか? –
補足として、 'srandom()'を複数回呼び出すことはお勧めしません。 'list_init()'でさえ未来のバグを避けるためには、一度しか呼び出されないことが知られています。例えば、 'main()'の一番上など、一度明示的に実行される場所にシーディングを移動する必要があります。 – RBerteig