【发布时间】:2013-10-02 18:46:07
【问题描述】:
我正在寻找一些我没有编写的代码中的一些奇怪的 Coverity 错误。在一种情况下,我们在循环中使用 TAILQ_FIRST 和 TAILQ_REMOVE,如下所示:
while (!TAILQ_EMPTY(&queue))
{
item* entry = TAILQ_FIRST(&queue);
TAILQ_REMOVE(&queue, entry, next);
free(entry);
}
Coverity 对此抱怨很多,说我在双重释放。但是,看看 TAILQ_REMOVE,这可能是正确的:(/usr/include/x86_64-linux-gnu/sys/queue.h 在我的 Linux 机器上)
#define TAILQ_REMOVE(head, elm, field) do { \
if (((elm)->field.tqe_next) != NULL) \
(elm)->field.tqe_next->field.tqe_prev = \
(elm)->field.tqe_prev; \
else \
(head)->tqh_last = (elm)->field.tqe_prev; \
*(elm)->field.tqe_prev = (elm)->field.tqe_next; \
} while (/*CONSTCOND*/0)
与其他一些相关宏不同,如果我删除头节点,我看不到任何重置 tqe_first 的内容。因此,我会在循环中不断获取已删除的节点。
但我真的不明白发生了什么。尽管有 Coverity 警告,此代码似乎仍然有效。
在网上找到这方面的例子很困难。
【问题讨论】:
-
可能有助于添加警告覆盖率