123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- From 962e532099d10ee6ce5b4ce68537bc46595230c0 Mon Sep 17 00:00:00 2001
- From: Joshua Watt <Joshua.Watt@garmin.com>
- Date: Tue, 24 Nov 2020 08:30:13 -0600
- Subject: [PATCH] Fix implicit fallthrough warning
- Fixes a warning about an implicit fall through in a case statement
- (-Werror=implicit-fallthrough) with newer versions of GCC
- Upstream-status: Submitted [https://github.com/gnosek/fcgiwrap/pull/54]
- Signed-off-by: Joshua Watt <Joshua.Watt@garmin.com>
- ---
- configure.ac | 3 +
- fcgiwrap.c | 7 ++
- m4/ax_gcc_func_attribute.m4 | 242 ++++++++++++++++++++++++++++++++++++
- 3 files changed, 252 insertions(+)
- create mode 100644 m4/ax_gcc_func_attribute.m4
- diff --git a/configure.ac b/configure.ac
- index bb3674e..9ef517a 100644
- --- a/configure.ac
- +++ b/configure.ac
- @@ -3,6 +3,7 @@
-
- AC_PREREQ(2.61)
- AC_INIT([fcgiwrap], [1.1.0], [root@localdomain.pl])
- +AC_CONFIG_MACRO_DIRS([m4])
- AM_CFLAGS="-std=gnu99 -Wall -Wextra -Werror -pedantic"
- if test x"$CFLAGS" = x""; then
- AM_CFLAGS="$AM_CFLAGS -O2 -g3"
- @@ -62,5 +63,7 @@ AC_FUNC_MALLOC
- AC_CHECK_FUNCS([strchr strdup strrchr])
- AC_CHECK_FUNCS([dup2 putenv select setenv strerror],, [AC_MSG_ERROR([seems as if your libraries don't provide an expected function])])
-
- +AX_GCC_FUNC_ATTRIBUTE([fallthrough])
- +
- AC_CONFIG_FILES([Makefile])
- AC_OUTPUT
- diff --git a/fcgiwrap.c b/fcgiwrap.c
- index b44d8aa..a83726b 100644
- --- a/fcgiwrap.c
- +++ b/fcgiwrap.c
- @@ -56,6 +56,12 @@
- #define UNIX_PATH_MAX 108
- #endif
-
- +#ifdef HAVE_FUNC_ATTRIBUTE_FALLTHROUGH
- +#define FALLTHROUGH __attribute__ ((fallthrough))
- +#else
- +#define FALLTHROUGH (void)
- +#endif
- +
- extern char **environ;
- static char * const * inherited_environ;
- static const char **allowed_programs;
- @@ -580,6 +586,7 @@ static void handle_fcgi_request(void)
- execl(filename, filename, (void *)NULL);
- cgi_error("502 Bad Gateway", "Cannot execute script", filename);
-
- + FALLTHROUGH;
- default: /* parent */
- close(pipe_in[0]);
- close(pipe_out[1]);
- diff --git a/m4/ax_gcc_func_attribute.m4 b/m4/ax_gcc_func_attribute.m4
- new file mode 100644
- index 0000000..da2b1ac
- --- /dev/null
- +++ b/m4/ax_gcc_func_attribute.m4
- @@ -0,0 +1,242 @@
- +# ===========================================================================
- +# https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
- +# ===========================================================================
- +#
- +# SYNOPSIS
- +#
- +# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
- +#
- +# DESCRIPTION
- +#
- +# This macro checks if the compiler supports one of GCC's function
- +# attributes; many other compilers also provide function attributes with
- +# the same syntax. Compiler warnings are used to detect supported
- +# attributes as unsupported ones are ignored by default so quieting
- +# warnings when using this macro will yield false positives.
- +#
- +# The ATTRIBUTE parameter holds the name of the attribute to be checked.
- +#
- +# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
- +#
- +# The macro caches its result in the ax_cv_have_func_attribute_<attribute>
- +# variable.
- +#
- +# The macro currently supports the following function attributes:
- +#
- +# alias
- +# aligned
- +# alloc_size
- +# always_inline
- +# artificial
- +# cold
- +# const
- +# constructor
- +# constructor_priority for constructor attribute with priority
- +# deprecated
- +# destructor
- +# dllexport
- +# dllimport
- +# error
- +# externally_visible
- +# fallthrough
- +# flatten
- +# format
- +# format_arg
- +# gnu_format
- +# gnu_inline
- +# hot
- +# ifunc
- +# leaf
- +# malloc
- +# noclone
- +# noinline
- +# nonnull
- +# noreturn
- +# nothrow
- +# optimize
- +# pure
- +# sentinel
- +# sentinel_position
- +# unused
- +# used
- +# visibility
- +# warning
- +# warn_unused_result
- +# weak
- +# weakref
- +#
- +# Unsupported function attributes will be tested with a prototype
- +# returning an int and not accepting any arguments and the result of the
- +# check might be wrong or meaningless so use with care.
- +#
- +# LICENSE
- +#
- +# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
- +#
- +# Copying and distribution of this file, with or without modification, are
- +# permitted in any medium without royalty provided the copyright notice
- +# and this notice are preserved. This file is offered as-is, without any
- +# warranty.
- +
- +#serial 12
- +
- +AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
- + AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
- +
- + AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
- + AC_LINK_IFELSE([AC_LANG_PROGRAM([
- + m4_case([$1],
- + [alias], [
- + int foo( void ) { return 0; }
- + int bar( void ) __attribute__(($1("foo")));
- + ],
- + [aligned], [
- + int foo( void ) __attribute__(($1(32)));
- + ],
- + [alloc_size], [
- + void *foo(int a) __attribute__(($1(1)));
- + ],
- + [always_inline], [
- + inline __attribute__(($1)) int foo( void ) { return 0; }
- + ],
- + [artificial], [
- + inline __attribute__(($1)) int foo( void ) { return 0; }
- + ],
- + [cold], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [const], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [constructor_priority], [
- + int foo( void ) __attribute__((__constructor__(65535/2)));
- + ],
- + [constructor], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [deprecated], [
- + int foo( void ) __attribute__(($1("")));
- + ],
- + [destructor], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [dllexport], [
- + __attribute__(($1)) int foo( void ) { return 0; }
- + ],
- + [dllimport], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [error], [
- + int foo( void ) __attribute__(($1("")));
- + ],
- + [externally_visible], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [fallthrough], [
- + int foo( void ) {switch (0) { case 1: __attribute__(($1)); case 2: break ; }};
- + ],
- + [flatten], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [format], [
- + int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
- + ],
- + [gnu_format], [
- + int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2)));
- + ],
- + [format_arg], [
- + char *foo(const char *p) __attribute__(($1(1)));
- + ],
- + [gnu_inline], [
- + inline __attribute__(($1)) int foo( void ) { return 0; }
- + ],
- + [hot], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [ifunc], [
- + int my_foo( void ) { return 0; }
- + static int (*resolve_foo(void))(void) { return my_foo; }
- + int foo( void ) __attribute__(($1("resolve_foo")));
- + ],
- + [leaf], [
- + __attribute__(($1)) int foo( void ) { return 0; }
- + ],
- + [malloc], [
- + void *foo( void ) __attribute__(($1));
- + ],
- + [noclone], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [noinline], [
- + __attribute__(($1)) int foo( void ) { return 0; }
- + ],
- + [nonnull], [
- + int foo(char *p) __attribute__(($1(1)));
- + ],
- + [noreturn], [
- + void foo( void ) __attribute__(($1));
- + ],
- + [nothrow], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [optimize], [
- + __attribute__(($1(3))) int foo( void ) { return 0; }
- + ],
- + [pure], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [sentinel], [
- + int foo(void *p, ...) __attribute__(($1));
- + ],
- + [sentinel_position], [
- + int foo(void *p, ...) __attribute__(($1(1)));
- + ],
- + [returns_nonnull], [
- + void *foo( void ) __attribute__(($1));
- + ],
- + [unused], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [used], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [visibility], [
- + int foo_def( void ) __attribute__(($1("default")));
- + int foo_hid( void ) __attribute__(($1("hidden")));
- + int foo_int( void ) __attribute__(($1("internal")));
- + int foo_pro( void ) __attribute__(($1("protected")));
- + ],
- + [warning], [
- + int foo( void ) __attribute__(($1("")));
- + ],
- + [warn_unused_result], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [weak], [
- + int foo( void ) __attribute__(($1));
- + ],
- + [weakref], [
- + static int foo( void ) { return 0; }
- + static int bar( void ) __attribute__(($1("foo")));
- + ],
- + [
- + m4_warn([syntax], [Unsupported attribute $1, the test may fail])
- + int foo( void ) __attribute__(($1));
- + ]
- + )], [])
- + ],
- + dnl GCC doesn't exit with an error if an unknown attribute is
- + dnl provided but only outputs a warning, so accept the attribute
- + dnl only if no warning were issued.
- + [AS_IF([grep -- -Wattributes conftest.err],
- + [AS_VAR_SET([ac_var], [no])],
- + [AS_VAR_SET([ac_var], [yes])])],
- + [AS_VAR_SET([ac_var], [no])])
- + ])
- +
- + AS_IF([test yes = AS_VAR_GET([ac_var])],
- + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
- + [Define to 1 if the system has the `$1' function attribute])], [])
- +
- + AS_VAR_POPDEF([ac_var])
- +])
- --
- 2.29.2
|