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() errormain
commit
f76fe4ab06
1
Makefile
1
Makefile
|
@ -995,6 +995,7 @@ LIB_OBJS += common-init.o
|
|||
LIB_OBJS += compat/nonblock.o
|
||||
LIB_OBJS += compat/obstack.o
|
||||
LIB_OBJS += compat/terminal.o
|
||||
LIB_OBJS += compiler-tricks/not-constant.o
|
||||
LIB_OBJS += config.o
|
||||
LIB_OBJS += connect.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 += -Wwrite-strings
|
||||
DEVELOPER_CFLAGS += -fno-common
|
||||
DEVELOPER_CFLAGS += -Wunreachable-code
|
||||
|
||||
ifneq ($(filter clang4,$(COMPILER_FEATURES)),)
|
||||
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))
|
||||
#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
|
||||
|
|
|
@ -264,6 +264,7 @@ libgit_sources = [
|
|||
'compat/nonblock.c',
|
||||
'compat/obstack.c',
|
||||
'compat/terminal.c',
|
||||
'compiler-tricks/not-constant.c',
|
||||
'config.c',
|
||||
'connect.c',
|
||||
'connected.c',
|
||||
|
@ -719,6 +720,7 @@ if get_option('warning_level') in ['2','3', 'everything'] and compiler.get_argum
|
|||
'-Woverflow',
|
||||
'-Wpointer-arith',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wunreachable-code',
|
||||
'-Wunused',
|
||||
'-Wvla',
|
||||
'-Wwrite-strings',
|
||||
|
|
|
@ -515,7 +515,13 @@ static void atfork_prepare(struct atfork_state *as)
|
|||
{
|
||||
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");
|
||||
#ifdef NO_PTHREADS
|
||||
if (sigprocmask(SIG_SETMASK, &all, &as->old))
|
||||
|
|
Loading…
Reference in New Issue