Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.

Commit

Permalink
Make illumos build warning-free. [skip appveyor]
Browse files Browse the repository at this point in the history
As it turns out, the root cause of Clang warnings about tcpdump.c on
illumos has to do with illumos headers rather than tcpdump.  Until the
bug fix is in place and has propagated well into illumos distributions,
use a workaround: add a new pair of diagnostic control macros for Clang
only and on illumos wrap the "offending" lines with it.

(cherry picked from commit 68761b4)
  • Loading branch information
infrastation committed Aug 29, 2024
1 parent 51ab30f commit c55ee59
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ DayOfTheWeek, Month DD, YYYY / The Tcpdump Group
Autoconf: don't use egrep, use $EGREP.
Autoconf: check for gethostbyaddr(), not gethostbyname().
Autoconf, CMake: search for gethostbyaddr() in libnetwork.
Make illumos build warning-free.
Documentation:
Fixed errors in doc/README.Win32.md and renamed it to README.windows.md.
Make various improvements to the man page.
Expand Down
8 changes: 1 addition & 7 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,7 @@ print_cc_version
# later warnings in the same matrix subset trigger an error.

case `cc_id`/`os_id` in
clang-*/SunOS-5.11)
# (Clang 9 on OpenIndiana, Clang 11 on OmniOS)
# tcpdump.c:2312:51: warning: this function declaration is not a prototype
# [-Wstrict-prototypes]
# tcpdump.c:2737:11: warning: this function declaration is not a prototype
# [-Wstrict-prototypes]
[ "`uname -o`" = illumos ] && TCPDUMP_TAINTED=yes
*)
;;
suncc-5.1[45]/SunOS-5.11)
# Various E_STATEMENT_NOT_REACHED and E_DEPRECATED_ATT warnings.
Expand Down
22 changes: 22 additions & 0 deletions diag-control.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,19 @@
#define DIAG_ON_C11_EXTENSIONS \
DIAG_DO_PRAGMA(clang diagnostic pop)
#endif

/*
* When Clang correctly detects an old-style function prototype after
* preprocessing, the warning can be irrelevant to this source tree because
* the prototype comes from a system header macro.
*/
#if ND_IS_AT_LEAST_CLANG_VERSION(5,0)
#define DIAG_OFF_STRICT_PROTOTYPES \
DIAG_DO_PRAGMA(clang diagnostic push) \
DIAG_DO_PRAGMA(clang diagnostic ignored "-Wstrict-prototypes")
#define DIAG_ON_STRICT_PROTOTYPES \
DIAG_DO_PRAGMA(clang diagnostic pop)
#endif
#elif ND_IS_AT_LEAST_GNUC_VERSION(4,2)
/* GCC apparently doesn't complain about ORing enums together. */

Expand Down Expand Up @@ -159,6 +172,9 @@
/*
* GCC supports -Wc99-c11-compat since version 5.1.0, but the warning does
* not trigger for now, so let's just leave it be.
*
* GCC does not currently generate any -Wstrict-prototypes warnings that
* would need silencing as is done for Clang above.
*/
#endif

Expand Down Expand Up @@ -206,6 +222,12 @@
#ifndef DIAG_ON_C11_EXTENSIONS
#define DIAG_ON_C11_EXTENSIONS
#endif
#ifndef DIAG_OFF_STRICT_PROTOTYPES
#define DIAG_OFF_STRICT_PROTOTYPES
#endif
#ifndef DIAG_ON_STRICT_PROTOTYPES
#define DIAG_ON_STRICT_PROTOTYPES
#endif
#ifndef ND_UNREACHABLE
#define ND_UNREACHABLE
#endif
Expand Down
21 changes: 21 additions & 0 deletions tcpdump.c
Original file line number Diff line number Diff line change
Expand Up @@ -2300,7 +2300,21 @@ DIAG_ON_WARN_UNUSED_RESULT
#endif
/* Cooperate with nohup(1) */
#ifndef _WIN32
/*
* In illumos /usr/include/sys/iso/signal_iso.h causes Clang to
* generate a -Wstrict-prototypes warning here, see [1]. The
* __illumos__ macro is available since at least GCC 11 and Clang 13,
* see [2].
* 1: https://www.illumos.org/issues/16344
* 2: https://www.illumos.org/issues/13726
*/
#ifdef __illumos__
DIAG_OFF_STRICT_PROTOTYPES
#endif /* __illumos__ */
if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
#ifdef __illumos__
DIAG_ON_STRICT_PROTOTYPES
#endif /* __illumos__ */
(void)setsignal(SIGHUP, oldhandler);
#endif /* _WIN32 */

Expand Down Expand Up @@ -2737,7 +2751,14 @@ static void
)
new.sa_flags = SA_RESTART;
if (sigaction(sig, &new, &old) < 0)
/* The same workaround as for SIG_DFL above. */
#ifdef __illumos__
DIAG_OFF_STRICT_PROTOTYPES
#endif /* __illumos__ */
return (SIG_ERR);
#ifdef __illumos__
DIAG_ON_STRICT_PROTOTYPES
#endif /* __illumos__ */
return (old.sa_handler);
#endif
}
Expand Down

0 comments on commit c55ee59

Please sign in to comment.