![](/img/trans.png)
[英]C: sys/queue.h - how to pass a pointer to TAILQ_HEAD() into a function, instead of having TAILQ_HEAD() be global?
[英]Why doesn't TAILQ_REMOVE reset the head pointer?
我正在跟蹤一些我未編寫的代碼中的一些Coverity錯誤。 在一種情況下,我們在循環中使用TAILQ_FIRST和TAILQ_REMOVE,如下所示:
while (!TAILQ_EMPTY(&queue))
{
item* entry = TAILQ_FIRST(&queue);
TAILQ_REMOVE(&queue, entry, next);
free(entry);
}
Coverity對此抱怨很多,說我要雙重釋放。 但是,查看TAILQ_REMOVE可能是正確的:(在我的Linux機器上為/usr/include/x86_64-linux-gnu/sys/queue.h
)
#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警告,但此代碼似乎仍然有效。
為此很難在網上找到實例。
這是tqe_prev
因為tqe_prev
是指向指針的指針。 如果非空,在隊列中的第一個元素都有tqe_prev
字段初始化為地址tqe_first
。 因此,如果要刪除第一個元素,則像在宏的最后一行中那樣對它進行引用和分配,最終將設置tqh_first
。 (通常, tqe_prev
具有上一個節點的tqe_next
指針的地址。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.