Squelch pointer conversion warnings in sessions.c.
authorDenis Ovsienko <denis@ovsienko.info>
Tue, 3 Aug 2021 11:33:22 +0000 (12:33 +0100)
committerDenis Ovsienko <denis@ovsienko.info>
Tue, 3 Aug 2021 11:41:59 +0000 (12:41 +0100)
Although compilers implement function-to-void pointer conversion, there
seems to be a difference in opinion whether it deserves a warning and
which level and wording would be the most appropriate.  That said,
libnids headers are unlikely to fix their expected pointer type, and the
warnings have been tainting Linux builds that have libnids-dev, so let's
just squelch them.

In compiler-tests.h synchronize Clang and XL C macros with libpcap.
Port diag-control.h from tcpdump, spell XL C tests and pragmas better
and put the default empty definitions after the if block to make it
easier to follow.  Remove the exemption rule.

Makefile.in
build.sh
compiler-tests.h
diag-control.h [new file with mode: 0644]
sessions.c

index 2b5ed79e8702c0d154e263002278d0ab70e1719f..672006625bf5d658f4fc18c4eefe836c0fdc2f0a 100644 (file)
@@ -81,6 +81,7 @@ SRC = $(CSRC) $(GENSRC)
 OBJ =  $(CSRC:.c=.o) $(GENSRC:.c=.o) $(LIBOBJS)
 HDR = \
        compiler-tests.h \
+       diag-control.h \
        gmt2local.h \
        machdep.h \
        sessions.h \
index 9acbc97d9fadfb9ab5dd55430119c1b625a004d1..cc95233f74390232f871a9aa68bf5568bcd026cf 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -18,20 +18,6 @@ print_cc_version
 run_after_echo ./configure --prefix="$PREFIX"
 run_after_echo make -s clean
 
-# Solaris 9 grep has no "-E" flag.
-# shellcheck disable=SC2006
-if [ "`sed -n '/^#define HAVE_LIBNIDS 1$/p' config.h | wc -l`" = 1 ]; then
-    # libnids calls trigger warnings on most OSes.
-    # See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83584
-    #
-    # sessions.c:424:20: warning: ISO C forbids passing argument 1 of
-    #   'nids_register_ip' between function pointer and 'void *' [-Wpedantic]
-    # sessions.c:425:21: warning: ISO C forbids passing argument 1 of
-    #   'nids_register_udp' between function pointer and 'void *' [-Wpedantic]
-    # sessions.c:426:21: warning: ISO C forbids passing argument 1 of
-    #   'nids_register_tcp' between function pointer and 'void *' [-Wpedantic]
-    TCPSLICE_TAINTED=yes
-fi
 # shellcheck disable=SC2006
 case `cc_id`/`os_id` in
 */SunOS-5.9)
index 367594da6a3fab15ecf2a026a41aa4eb3bf7f04f..961d1f8ab2310121a3e5eca95f33c083e75e4101 100644 (file)
         (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
 #endif
 
+/*
+ * Check whether this is Clang major.minor or a later release.
+ */
+
+#if !defined(__clang__)
+#define TCPSLICE_IS_AT_LEAST_CLANG_VERSION(major, minor) 0
+#else
+#define TCPSLICE_IS_AT_LEAST_CLANG_VERSION(major, minor) \
+       (__clang_major__ > (major) || \
+        (__clang_major__ == (major) && __clang_minor__ >= (minor)))
+#endif
+
 /*
  * Check whether this is Sun C/SunPro C/Oracle Studio major.minor
  * or a later release.
  *
  * The version number in __xlC__ has the major version in the
  * upper 8 bits and the minor version in the lower 8 bits.
+ * On AIX __xlC__ is always defined, __ibmxl__ becomes defined in XL C 16.1.
+ * On Linux since XL C 13.1.6 __xlC__ is not defined by default anymore, but
+ * __ibmxl__ is defined since at least XL C 13.1.1.
  */
 
 #if ! defined(__xlC__)
+#if ! defined(__ibmxl__)
 #define TCPSLICE_IS_AT_LEAST_XL_C_VERSION(major,minor) 0
 #else
+#define TCPSLICE_IS_AT_LEAST_XL_C_VERSION(major, minor) \
+       (__ibmxl_version__ > (major) || \
+        (__ibmxl_version__ == (major) && __ibmxl_release__ >= (minor)))
+#endif /* ! __ibmxl__ */
+#else /* ! __xlC__ */
 #define TCPSLICE_IS_AT_LEAST_XL_C_VERSION(major, minor) \
        (__xlC__ >= (((major) << 8) | (minor)))
 #endif
diff --git a/diag-control.h b/diag-control.h
new file mode 100644 (file)
index 0000000..4ecb48e
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2021 The Tcpdump Group
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef tcpslice_diag_control_h
+#define tcpslice_diag_control_h
+
+#include "compiler-tests.h"
+#define DIAG_DO_PRAGMA(x) _Pragma (#x)
+
+/*
+ * XL C has to be tested first because starting with version 16.1 it defines
+ * both __GNUC__ and __clang__.
+ */
+#if TCPSLICE_IS_AT_LEAST_XL_C_VERSION(1,0)
+  /*
+   * GCC diagnostic pragmas became available in XL C version 16.1.0, for Linux
+   * only. XL C for Linux always defines __linux__.
+   */
+  #if TCPSLICE_IS_AT_LEAST_XL_C_VERSION(16,1) && defined(__linux__)
+    #define DIAG_OFF_PEDANTIC \
+      DIAG_DO_PRAGMA(GCC diagnostic push) \
+      DIAG_DO_PRAGMA(GCC diagnostic ignored "-Wpedantic")
+    #define DIAG_ON_PEDANTIC \
+      DIAG_DO_PRAGMA(GCC diagnostic pop)
+  #endif
+/*
+ * Clang defines __GNUC__ and __GNUC_MINOR__, so has to be tested before GCC.
+ */
+#elif TCPSLICE_IS_AT_LEAST_CLANG_VERSION(2,8)
+  #define DIAG_OFF_PEDANTIC \
+    DIAG_DO_PRAGMA(clang diagnostic push) \
+    DIAG_DO_PRAGMA(clang diagnostic ignored "-Wpedantic")
+  #define DIAG_ON_PEDANTIC \
+    DIAG_DO_PRAGMA(clang diagnostic pop)
+/*
+ * GCC 4.6 has working ignored/push/pop.
+ */
+#elif TCPSLICE_IS_AT_LEAST_GNUC_VERSION(4,6)
+  /*
+   * -Wpedantic became available in GCC 4.8.0.
+   */
+  #if TCPSLICE_IS_AT_LEAST_GNUC_VERSION(4,8)
+    #define DIAG_OFF_PEDANTIC \
+      DIAG_DO_PRAGMA(GCC diagnostic push) \
+      DIAG_DO_PRAGMA(GCC diagnostic ignored "-Wpedantic")
+    #define DIAG_ON_PEDANTIC \
+      DIAG_DO_PRAGMA(GCC diagnostic pop)
+  #endif
+#endif
+
+#if !defined(DIAG_OFF_PEDANTIC)
+#define DIAG_OFF_PEDANTIC
+#endif
+#if !defined(DIAG_ON_PEDANTIC)
+#define DIAG_ON_PEDANTIC
+#endif
+
+#endif /* _diag_control_h */
index 4fa40299705e413a7f1d267d4ae2dc03516e89d7..2aa16cd246efc9381e9d2828ebbaa14cadf226b2 100644 (file)
@@ -49,6 +49,7 @@
 
 #include "varattrs.h"
 #include "sessions.h"
+#include "diag-control.h"
 
 /*
  * The global variables below have the following purposes:
@@ -421,9 +422,16 @@ void                               sessions_nids_init(pcap_t *p)
   if (!nids_init()) {
     error("%s(): %s", __func__, nids_errbuf);
   }
+  /*
+   * These conversions between function pointer and void pointer upset GCC,
+   * Clang and XL C.
+   * See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83584
+   */
+  DIAG_OFF_PEDANTIC
   nids_register_ip(ip_callback);
   nids_register_udp(udp_callback);
   nids_register_tcp(tcp_callback);
+  DIAG_ON_PEDANTIC
 }
 
 static struct session *