필자가 작성하지 않은 코드에서 몇 가지 이상한 Coverity 버그를 추적하고 있습니다. 한 경우, 우리는 TAILQ_FIRST 및 TAILQ_REMOVE은과 같이, 루프에서 사용TAILQ_REMOVE가 헤드 포인터를 재설정하지 않는 이유는 무엇입니까?
while (!TAILQ_EMPTY(&queue))
{
item* entry = TAILQ_FIRST(&queue);
TAILQ_REMOVE(&queue, entry, next);
free(entry);
}
커버 리티 내가 두 번 해방이야 말, 이것에 대해 많이 뿌려줍니다. 나는 헤드 노드를 삭제하면 다른 관련 매크로 달리
#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
을 재설정 여기에 아무것도 표시되지 않습니다 (내 리눅스 박스에 /usr/include/x86_64-linux-gnu/sys/queue.h
) : 그러나, TAILQ_REMOVE보고이 바로 수 있습니다. 따라서, 나는 내 루프에서 삭제 된 노드를 계속 얻을 것이다.
하지만 실제로 어떤 일이 일어나는지 이해하지 못합니다. 이 코드는 Coverity 경고에도 불구하고 작동하는 것으로 보입니다.
그물을 찾는 것은 어렵습니다.
가명에서 제공하는 경고를 추가하는 것이 도움이 될 수 있습니다 – nos