autotools: add -Wimplicit-fallthrough

parent 08549241
...@@ -633,3 +633,32 @@ string. ...@@ -633,3 +633,32 @@ string.
Unless you have a valid reason to accept truncation you must check whether Unless you have a valid reason to accept truncation you must check whether
truncation has occurred, treat it as an error, and handle the error truncation has occurred, treat it as an error, and handle the error
appropriately. appropriately.
## 25) Use `__fallthrough__` in switch statements
If LXC detects that the compiler is new enough it will tell it to check
`switch` statements for non-documented fallthroughs. Please always place
a `__fallthrough__` after a `case` which falls through the next one.
```c
int lxc_attach_run_command(void *payload)
{
int ret = -1;
lxc_attach_command_t *cmd = payload;
ret = execvp(cmd->program, cmd->argv);
if (ret < 0) {
switch (errno) {
case ENOEXEC:
ret = 126;
break;
case ENOENT:
ret = 127;
break;
}
}
SYSERROR("Failed to exec \"%s\"", cmd->program);
return ret;
}
```
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@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 6
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS
...@@ -683,6 +683,9 @@ AC_PROG_SED ...@@ -683,6 +683,9 @@ AC_PROG_SED
# See if we support thread-local storage. # See if we support thread-local storage.
LXC_CHECK_TLS LXC_CHECK_TLS
AX_CHECK_COMPILE_FLAG([-fdiagnostics-color], [CFLAGS="$CFLAGS -fdiagnostics-color"],,[-Werror])
AX_CHECK_COMPILE_FLAG([-fdiagnostics-color], [CFLAGS="$CFLAGS -Wimplicit-fallthrough"],,[-Werror])
CFLAGS="$CFLAGS -Wvla -std=gnu11" CFLAGS="$CFLAGS -Wvla -std=gnu11"
if test "x$enable_werror" = "xyes"; then if test "x$enable_werror" = "xyes"; then
CFLAGS="$CFLAGS -Werror" CFLAGS="$CFLAGS -Werror"
......
...@@ -1520,8 +1520,10 @@ int lxc_attach_run_command(void *payload) ...@@ -1520,8 +1520,10 @@ int lxc_attach_run_command(void *payload)
switch (errno) { switch (errno) {
case ENOEXEC: case ENOEXEC:
ret = 126; ret = 126;
break;
case ENOENT: case ENOENT:
ret = 127; ret = 127;
break;
} }
} }
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <lxc/lxccontainer.h> #include <lxc/lxccontainer.h>
#include <lxc/version.h> #include <lxc/version.h>
#include "compiler.h"
#include "error.h" #include "error.h"
#include "initutils.h" #include "initutils.h"
#include "log.h" #include "log.h"
...@@ -466,7 +467,7 @@ out: ...@@ -466,7 +467,7 @@ out:
exit(exit_with); exit(exit_with);
} }
static void print_usage(const struct option longopts[]) __noreturn__ static void print_usage_exit(const struct option longopts[])
{ {
fprintf(stderr, "Usage: lxc-init [-n|--name=NAME] [-h|--help] [--usage] [--version]\n\ fprintf(stderr, "Usage: lxc-init [-n|--name=NAME] [-h|--help] [--usage] [--version]\n\
...@@ -474,7 +475,7 @@ static void print_usage(const struct option longopts[]) ...@@ -474,7 +475,7 @@ static void print_usage(const struct option longopts[])
exit(0); exit(0);
} }
static void print_version(void) __noreturn__ static void print_version_exit(void)
{ {
printf("%s\n", LXC_VERSION); printf("%s\n", LXC_VERSION);
exit(0); exit(0);
...@@ -531,9 +532,9 @@ static int arguments_parse(struct arguments *args, int argc, ...@@ -531,9 +532,9 @@ static int arguments_parse(struct arguments *args, int argc,
args->lxcpath = optarg; args->lxcpath = optarg;
break; break;
case OPT_USAGE: case OPT_USAGE:
print_usage(args->options); print_usage_exit(args->options);
case OPT_VERSION: case OPT_VERSION:
print_version(); print_version_exit();
case '?': case '?':
print_help(); print_help();
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
......
...@@ -32,4 +32,18 @@ ...@@ -32,4 +32,18 @@
#endif #endif
#endif #endif
#if defined(__GNUC__) && __GNUC__ >= 7 || defined(__clang__)
#define __fallthrough__ __attribute__((fallthrough))
#else
#define __fallthrough__
#endif
#ifndef _noreturn_
#if __STDC_VERSION__ >= 201112L
#define __noreturn__ _Noreturn
#else
#define __noreturn__ __attribute__((noreturn))
#endif
#endif
#endif /* __LXC_COMPILER_H */ #endif /* __LXC_COMPILER_H */
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <lxc/version.h> #include <lxc/version.h>
#include "arguments.h" #include "arguments.h"
#include "compiler.h"
#include "namespace.h" #include "namespace.h"
#include "initutils.h" #include "initutils.h"
...@@ -87,8 +88,8 @@ is2big: ...@@ -87,8 +88,8 @@ is2big:
return -1; return -1;
} }
static void print_usage_exit(const struct option longopts[], __noreturn__ static void print_usage_exit(const struct option longopts[],
const struct lxc_arguments *a_args) const struct lxc_arguments *a_args)
{ {
int i; int i;
...@@ -134,13 +135,14 @@ static void print_usage_exit(const struct option longopts[], ...@@ -134,13 +135,14 @@ static void print_usage_exit(const struct option longopts[],
exit(0); exit(0);
} }
static void print_version_exit() __noreturn__ static void print_version_exit()
{ {
printf("%s\n", lxc_get_version()); printf("%s\n", lxc_get_version());
exit(0); exit(0);
} }
static void print_help_exit(const struct lxc_arguments *args, int code) __noreturn__ static void print_help_exit(const struct lxc_arguments *args,
int code)
{ {
fprintf(stderr, "\ fprintf(stderr, "\
Usage: %s %s\ Usage: %s %s\
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment