autobuf: fix warning in Windows release builds
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 27 May 2015 13:02:35 +0000 (15:02 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 27 May 2015 13:13:13 +0000 (15:13 +0200)
Happens on Fedora 22 with GCC 5:
x86_64-w64-mingw32-gcc (GCC) 5.1.0 20150422 (Fedora MinGW 5.1.0-1.fc22)

src/common/autobuf.c: In function 'abuf_strftime':
src/common/autobuf.c:223:1: warning: assuming signed overflow does not occur when assuming that (X + c) >= X is always true [-Wstrict-overflow]
 }
 ^
src/common/autobuf.c:92:6: warning: assuming signed overflow does not occur when assuming that (X + c) >= X is always true [-Wstrict-overflow]
   if (new_size > autobuf->size) {

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/common/autobuf.c
src/common/autobuf.h

index d6ba6a8..960c526 100644 (file)
 #include <stdlib.h>
 #include <errno.h>
 #include <limits.h>
+#include <assert.h>
 
 
 static int autobuf_enlarge(struct autobuf *autobuf, int new_size);
 
+static int ROUND_UP_TO_POWER_OF_2(int val, int pow2) {
+  assert(val >= 0);
+  assert(pow2 > 0);
+
+  if (val <= (INT32_MAX - (pow2 - 1))) {
+    /* no overflow */
+    return ((val + (pow2 - 1)) & ~(pow2 - 1));
+  }
+
+  /* overflow */
+  return (INT32_MAX & ~(pow2 - 1));
+}
 
 int
 abuf_init(struct autobuf *autobuf, int initial_size)
index 4b28d82..f28c868 100644 (file)
@@ -48,8 +48,6 @@ struct autobuf;
 #include <stdarg.h>
 #include <time.h>
 
-#define ROUND_UP_TO_POWER_OF_2(val, pow2) (((val) + (pow2) - 1) & ~((pow2) - 1))
-
 #define AUTOBUFCHUNK   4096
 struct autobuf {
   int size;