测试单链表性能时出现AddressSanitizer错误

AddressSanitizer errors when testing the performance of singly linked list

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

我自己写的代码好像能用,我uploaded为了测试目的,可以编译,运行在浏览器上联机。

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

.

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

如有任何建议,我们将不胜感激。

至少有这些错误:

  • 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指针)。只需交换最后两行即可。