From 73bdb325edfc12a58ff6a7ebec77d56d62dcabe0 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Wed, 19 Apr 2017 11:34:10 +0200 Subject: [PATCH] BUG/MAJOR: Use -fwrapv. Haproxy relies on signed integer wraparound on overflow, however this is really an undefined behavior, so the C compiler is allowed to do whatever it wants, and clang does exactly that, and that causes problems when the timer goes from <= INT_MAX to > INT_MAX, and explains the various hangs reported on FreeBSD every 49.7 days. To make sure we get the intended behavior, use -fwrapv for now. A proper fix is to switch everything to unsigned, and it will happen later, but this is simpler, and more likely to be backported to the stable branches. Many thanks to David King, Mark S, Dave Cottlehuber, Slawa Olhovchenkov, Piotr Pawel Stefaniak, and any other I may have forgotten for reporting that and investigating. --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a87e1e24be..4598274bec 100644 --- a/Makefile +++ b/Makefile @@ -131,7 +131,10 @@ DEBUG_CFLAGS = -g #### Compiler-specific flags that may be used to disable some negative over- # optimization or to silence some warnings. -fno-strict-aliasing is needed with # gcc >= 4.4. -SPEC_CFLAGS = -fno-strict-aliasing -Wdeclaration-after-statement +# We rely on signed integer wraparound on overflow, however clang think it +# can do whatever it wants since it's an undefined behavior, so use -fwrapv +# to be sure we get the intended behavior. +SPEC_CFLAGS = -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv #### Memory usage tuning # If small memory footprint is required, you can reduce the buffer size. There -- 2.39.5