malloc() 如何导致 SIGSEGV?

编程入门 行业动态 更新时间:2024-10-11 17:28:34
本文介绍了malloc() 如何导致 SIGSEGV?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我的程序中有一个奇怪的错误,在我看来 malloc() 导致了 SIGSEGV,据我所知,这没有任何意义.我正在为动态列表使用一个名为 simclist 的库.

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;

这里是代码:

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_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; }

行 l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * 是根据堆栈跟踪导致 SIGSEGV 的位置.我正在使用 gdb/nemiver 进行调试,但我不知所措.第一次调用这个函数时它工作正常,但第二次总是失败.malloc() 怎么会导致 SIGSEGV?

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?

这是堆栈跟踪:

#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!

推荐答案

malloc 可能会出现段错误,例如当堆损坏时.检查你写的东西没有超出任何先前分配的范围.

malloc can segfault for example when the heap is corrupted. Check that you are not writing anything beyond the bounds of any previous allocation.

更多推荐

malloc() 如何导致 SIGSEGV?

本文发布于:2023-07-14 10:37:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1104129.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:malloc   SIGSEGV

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!