Merge branch 'jk/use-wunreachable-code-for-devs'
Enable -Wunreachable-code for developer builds. * jk/use-wunreachable-code-for-devs: config.mak.dev: enable -Wunreachable-code git-compat-util: add NOT_CONSTANT macro and use it in atfork_prepare() run-command: use errno to check for sigfillset() errormaint
commit
f76fe4ab06
1
Makefile
1
Makefile
|
@ -995,6 +995,7 @@ LIB_OBJS += common-init.o
|
||||||
LIB_OBJS += compat/nonblock.o
|
LIB_OBJS += compat/nonblock.o
|
||||||
LIB_OBJS += compat/obstack.o
|
LIB_OBJS += compat/obstack.o
|
||||||
LIB_OBJS += compat/terminal.o
|
LIB_OBJS += compat/terminal.o
|
||||||
|
LIB_OBJS += compiler-tricks/not-constant.o
|
||||||
LIB_OBJS += config.o
|
LIB_OBJS += config.o
|
||||||
LIB_OBJS += connect.o
|
LIB_OBJS += connect.o
|
||||||
LIB_OBJS += connected.o
|
LIB_OBJS += connected.o
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#include <git-compat-util.h>
|
||||||
|
int false_but_the_compiler_does_not_know_it_;
|
|
@ -39,6 +39,7 @@ DEVELOPER_CFLAGS += -Wunused
|
||||||
DEVELOPER_CFLAGS += -Wvla
|
DEVELOPER_CFLAGS += -Wvla
|
||||||
DEVELOPER_CFLAGS += -Wwrite-strings
|
DEVELOPER_CFLAGS += -Wwrite-strings
|
||||||
DEVELOPER_CFLAGS += -fno-common
|
DEVELOPER_CFLAGS += -fno-common
|
||||||
|
DEVELOPER_CFLAGS += -Wunreachable-code
|
||||||
|
|
||||||
ifneq ($(filter clang4,$(COMPILER_FEATURES)),)
|
ifneq ($(filter clang4,$(COMPILER_FEATURES)),)
|
||||||
DEVELOPER_CFLAGS += -Wtautological-constant-out-of-range-compare
|
DEVELOPER_CFLAGS += -Wtautological-constant-out-of-range-compare
|
||||||
|
|
|
@ -1583,4 +1583,13 @@ static inline void *container_of_or_null_offset(void *ptr, size_t offset)
|
||||||
((uintptr_t)&(ptr)->member - (uintptr_t)(ptr))
|
((uintptr_t)&(ptr)->member - (uintptr_t)(ptr))
|
||||||
#endif /* !__GNUC__ */
|
#endif /* !__GNUC__ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevent an overly clever compiler from optimizing an expression
|
||||||
|
* out, triggering a false positive when building with the
|
||||||
|
* -Wunreachable-code option. false_but_the_compiler_does_not_know_it_
|
||||||
|
* is defined in a compilation unit separate from where the macro is
|
||||||
|
* used, initialized to 0, and never modified.
|
||||||
|
*/
|
||||||
|
#define NOT_CONSTANT(expr) ((expr) || false_but_the_compiler_does_not_know_it_)
|
||||||
|
extern int false_but_the_compiler_does_not_know_it_;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -264,6 +264,7 @@ libgit_sources = [
|
||||||
'compat/nonblock.c',
|
'compat/nonblock.c',
|
||||||
'compat/obstack.c',
|
'compat/obstack.c',
|
||||||
'compat/terminal.c',
|
'compat/terminal.c',
|
||||||
|
'compiler-tricks/not-constant.c',
|
||||||
'config.c',
|
'config.c',
|
||||||
'connect.c',
|
'connect.c',
|
||||||
'connected.c',
|
'connected.c',
|
||||||
|
@ -719,6 +720,7 @@ if get_option('warning_level') in ['2','3', 'everything'] and compiler.get_argum
|
||||||
'-Woverflow',
|
'-Woverflow',
|
||||||
'-Wpointer-arith',
|
'-Wpointer-arith',
|
||||||
'-Wstrict-prototypes',
|
'-Wstrict-prototypes',
|
||||||
|
'-Wunreachable-code',
|
||||||
'-Wunused',
|
'-Wunused',
|
||||||
'-Wvla',
|
'-Wvla',
|
||||||
'-Wwrite-strings',
|
'-Wwrite-strings',
|
||||||
|
|
|
@ -515,7 +515,13 @@ static void atfork_prepare(struct atfork_state *as)
|
||||||
{
|
{
|
||||||
sigset_t all;
|
sigset_t all;
|
||||||
|
|
||||||
if (sigfillset(&all))
|
/*
|
||||||
|
* POSIX says sigfillset() can fail, but an overly clever
|
||||||
|
* compiler can see through the header files and decide
|
||||||
|
* it cannot fail on a particular platform it is compiling for,
|
||||||
|
* triggering -Wunreachable-code false positive.
|
||||||
|
*/
|
||||||
|
if (NOT_CONSTANT(sigfillset(&all)))
|
||||||
die_errno("sigfillset");
|
die_errno("sigfillset");
|
||||||
#ifdef NO_PTHREADS
|
#ifdef NO_PTHREADS
|
||||||
if (sigprocmask(SIG_SETMASK, &all, &as->old))
|
if (sigprocmask(SIG_SETMASK, &all, &as->old))
|
||||||
|
|
Loading…
Reference in New Issue