From 07370ed5c072da2006929bb6fa8c7ebb69b3f2b6 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Tue, 12 Oct 2021 08:41:42 -0600 Subject: [PATCH] queue.h: suppress scan-build warnings If running under scan-build, use our own implementations of all the macros which include some code to satisfy scan-build warnings. --- src/queue.h | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/queue.h b/src/queue.h index 153d02ab49..1ece2d101c 100644 --- a/src/queue.h +++ b/src/queue.h @@ -51,19 +51,14 @@ #include "autoconf.h" -#ifdef HAVE_SYS_QUEUE_H +#if defined(HAVE_SYS_QUEUE_H) && !defined(__clang_analyzer__) #include #endif -/* Not included in Linux, but are in FreeBSD and friends. - * - * This implementation from FreeBSD's sys/queue.h. - */ -#ifndef TAILQ_FOREACH_SAFE -#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = TAILQ_FIRST((head)); \ - (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) +#if defined(__clang_analyzer__) +#define _Q_ASSERT(a) assert((a)) +#else +#define _Q_ASSERT(a) #endif /* The BSDs have removed CIRCLEQ but it still exists in Linux. @@ -225,7 +220,8 @@ struct { \ * Complete TAILQ implementation as sys/queue.h is not available on Windows * and used by Suricata. * - * This implementation copied from FreeBSD sys/queue.h. + * This implementation copied from FreeBSD sys/queue.h with the addition + * of our _Q_ASSERT macros to satisy scan-build. */ #ifndef TAILQ_HEAD @@ -297,9 +293,12 @@ struct { \ } while (0) #define TAILQ_INSERT_TAIL(head, elm, field) do { \ + _Q_ASSERT((elm)); \ + _Q_ASSERT((head)); \ TAILQ_NEXT((elm), field) = NULL; \ (elm)->field.tqe_prev = (head)->tqh_last; \ *(head)->tqh_last = (elm); \ + _Q_ASSERT(*(head)->tqh_last); \ (head)->tqh_last = &TAILQ_NEXT((elm), field); \ } while (0) @@ -317,9 +316,21 @@ struct { \ (elm)->field.tqe_prev; \ else \ (head)->tqh_last = (elm)->field.tqe_prev; \ + _Q_ASSERT((head)->tqh_first != (elm)); \ *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ } while (0) #endif /* !TAILQ_HEAD */ +/* Not included in Linux, but are in FreeBSD and friends. + * + * This implementation from FreeBSD's sys/queue.h. + */ +#ifndef TAILQ_FOREACH_SAFE +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) +#endif + #endif /* !SURICATA_QUEUE_H */ -- 2.47.2