autotools: add -Wimplicit-fallthrough

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2018-09-21 14:54:06 +02:00
parent 0854924119
commit cf0fd972be
No known key found for this signature in database
GPG Key ID: 8EB056D53EECB12D
7 changed files with 112 additions and 8 deletions

View File

@ -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;
}
```

View File

@ -0,0 +1,53 @@
# ===========================================================================
# 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

View File

@ -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"

View File

@ -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;
} }
} }

View File

@ -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:
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[])
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,
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);

View File

@ -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 */

View File

@ -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:
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[],
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\