mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-24 22:56:47 +00:00
autotools: add -Wimplicit-fallthrough
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
0854924119
commit
cf0fd972be
@ -633,3 +633,32 @@ string.
|
||||
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
|
||||
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;
|
||||
}
|
||||
```
|
||||
|
53
config/ax_check_compile_flag.m4
Normal file
53
config/ax_check_compile_flag.m4
Normal 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
|
@ -683,6 +683,9 @@ AC_PROG_SED
|
||||
# See if we support thread-local storage.
|
||||
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"
|
||||
if test "x$enable_werror" = "xyes"; then
|
||||
CFLAGS="$CFLAGS -Werror"
|
||||
|
@ -1520,8 +1520,10 @@ int lxc_attach_run_command(void *payload)
|
||||
switch (errno) {
|
||||
case ENOEXEC:
|
||||
ret = 126;
|
||||
break;
|
||||
case ENOENT:
|
||||
ret = 127;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <lxc/lxccontainer.h>
|
||||
#include <lxc/version.h>
|
||||
|
||||
#include "compiler.h"
|
||||
#include "error.h"
|
||||
#include "initutils.h"
|
||||
#include "log.h"
|
||||
@ -466,7 +467,7 @@ out:
|
||||
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\
|
||||
@ -474,7 +475,7 @@ static void print_usage(const struct option longopts[])
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void print_version(void)
|
||||
__noreturn__ static void print_version_exit(void)
|
||||
{
|
||||
printf("%s\n", LXC_VERSION);
|
||||
exit(0);
|
||||
@ -531,9 +532,9 @@ static int arguments_parse(struct arguments *args, int argc,
|
||||
args->lxcpath = optarg;
|
||||
break;
|
||||
case OPT_USAGE:
|
||||
print_usage(args->options);
|
||||
print_usage_exit(args->options);
|
||||
case OPT_VERSION:
|
||||
print_version();
|
||||
print_version_exit();
|
||||
case '?':
|
||||
print_help();
|
||||
exit(EXIT_FAILURE);
|
||||
|
@ -32,4 +32,18 @@
|
||||
#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 */
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <lxc/version.h>
|
||||
|
||||
#include "arguments.h"
|
||||
#include "compiler.h"
|
||||
#include "namespace.h"
|
||||
#include "initutils.h"
|
||||
|
||||
@ -87,8 +88,8 @@ is2big:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void print_usage_exit(const struct option longopts[],
|
||||
const struct lxc_arguments *a_args)
|
||||
__noreturn__ static void print_usage_exit(const struct option longopts[],
|
||||
const struct lxc_arguments *a_args)
|
||||
|
||||
{
|
||||
int i;
|
||||
@ -134,13 +135,14 @@ static void print_usage_exit(const struct option longopts[],
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void print_version_exit()
|
||||
__noreturn__ static void print_version_exit()
|
||||
{
|
||||
printf("%s\n", lxc_get_version());
|
||||
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, "\
|
||||
Usage: %s %s\
|
||||
|
Loading…
Reference in New Issue
Block a user