【问题标题】:AddressSanitizer errors when testing the performance of singly linked list测试单链表性能时出现 AddressSanitizer 错误
【发布时间】:2019-07-11 00:57:30
【问题描述】:

我正在创建一个单链表。为了创建它,我编写了诸如struct node 之类的结构和list_free_node 之类的操作。现在这是我第一次使用mallocpointers,我遇到了一些我以前从未见过的错误(我认为与这两个概念有关)。

我写的代码在我自己测试时似乎可以工作,我uploaded它用于测试目的,它可以编译并在浏览器中在线运行。

但是,当我使用make check 时,check_list.c 会自动检查它。发生这种情况时,我会遇到以前从未见过的错误。

.

我搜索了这些错误,发现它与堆栈溢出有关。我认为错误可能是我使用了一个不存在的指针或其他东西。但是,当我手动运行我的代码时,它似乎工作得很好。我不明白这是怎么发生的。

任何建议将不胜感激。

【问题讨论】:

  • 问题可能是由您构建应用程序的方式引起的。请发布一些详细信息(哪个编译器版本,您使用的标志等)。
  • 不要发布错误信息的图片。以文本形式发布错误消息。
  • 以后会做的,谢谢。

标签: c linked-list stack-overflow singly-linked-list address-sanitizer


【解决方案1】:

至少有这些错误:

  • list_add_front()

                if (l -> head == NULL) {
                        l -> head = n;
                        return 0;
    

    这里你忘了n->next 还没有初始化;缺少与n->next = NULL 等效的内容。当然你可以合并相似的ifelse 主体并单独编写

                n -> next = l -> head;
                l -> head = n;
                return 0;
    
  • list_add_back()

    这里你也忘记了n->next 还没有被初始化并且n->next = NULL 丢失了。

    或者,您可以在list_new_node() 中设置n->next = NULL

  • list_cleanup()

                currentnode = nextnode;
                list_free_node(currentnode);
                nextnode = list_next(nextnode);
    

    在节点被释放后我们不能使用节点内容,因此我们不能在list_free_node()之后调用list_next()(它需要节​​点的->next指针)。只需交换最后两行即可。

【讨论】:

  • list_new_node() 也需要n -> next = NULL;。非常感谢。现在一切正常。
猜你喜欢
  • 2011-08-12
  • 2021-01-25
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2013-01-01
相关资源
最近更新 更多