Create workaround for warnings generated by a broken C99 compiler
authorTrond Norbye <trond.norbye@sun.com>
Mon, 5 Oct 2009 22:32:26 +0000 (00:32 +0200)
committerTrond Norbye <trond.norbye@sun.com>
Mon, 5 Oct 2009 22:32:26 +0000 (00:32 +0200)
Some of the flags to turn on extra analysis and warnings in gcc contains
various bugs related to struct initializations (see section 6.7.8 in C99)
causing bogus warnings to be generated. Due to the fact that we compile
with warning == error, this is a showstopper for us. We cannot expect all
users to be running the latest compilers, so we have to create the workaround
in our code.

example/Makefile.am
example/interface_v0.c
example/memcached_light.c
example/memcached_light.h [new file with mode: 0644]
libmemcached/protocol/binary_handler.c

index 62bd5911cbf5100cc372714a5d3935e24bdd9257..9c57082231066bcff7b3474afd368c2639e62e6e 100644 (file)
@@ -1,6 +1,7 @@
 noinst_PROGRAMS = memcached_light
 
 memcached_light_SOURCES= memcached_light.c \
+                         memcached_light.h \
                          storage.h \
                          interface_v0.c \
                          interface_v1.c
index 041fe31e9ec767a5332e6e5c757c9294e69c9afa..85dd2c7d426dad28caafe73b5c2cdf0c3761ca34 100644 (file)
@@ -20,6 +20,7 @@
 #include <libmemcached/protocol_handler.h>
 #include <libmemcached/byteorder.h>
 #include "storage.h"
+#include "memcached_light.h"
 
 static protocol_binary_response_status noop_command_handler(const void *cookie,
                                                             protocol_binary_request_header *header,
@@ -521,6 +522,13 @@ static protocol_binary_response_status stat_command_handler(const void *cookie,
 
 memcached_binary_protocol_callback_st interface_v0_impl= {
   .interface_version= 0,
+#ifdef FUTURE
+  /*
+  ** There is a number of bugs in the extra options for gcc causing 
+  ** warning on these struct initializers. It hurts my heart to remove
+  ** it so I'll just leave it in here so that we can enable it when
+  ** we can drop support for the broken compilers
+  */
   .interface.v0.comcode[PROTOCOL_BINARY_CMD_GET]= get_command_handler,
   .interface.v0.comcode[PROTOCOL_BINARY_CMD_SET]= set_command_handler,
   .interface.v0.comcode[PROTOCOL_BINARY_CMD_ADD]= add_command_handler,
@@ -548,4 +556,36 @@ memcached_binary_protocol_callback_st interface_v0_impl= {
   .interface.v0.comcode[PROTOCOL_BINARY_CMD_FLUSHQ]= flush_command_handler,
   .interface.v0.comcode[PROTOCOL_BINARY_CMD_APPENDQ]= concat_command_handler,
   .interface.v0.comcode[PROTOCOL_BINARY_CMD_PREPENDQ]= concat_command_handler,
+#endif
 };
+
+void initialize_iterface_v0_handler(void)
+{
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_GET]= get_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_SET]= set_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_ADD]= add_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_REPLACE]= replace_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_DELETE]= delete_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_INCREMENT]= arithmetic_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_DECREMENT]= arithmetic_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_QUIT]= quit_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_FLUSH]= flush_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_GETQ]= get_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_NOOP]= noop_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_VERSION]= version_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_GETK]= get_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_GETKQ]= get_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_APPEND]= concat_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_PREPEND]= concat_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_STAT]= stat_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_SETQ]= set_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_ADDQ]= add_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_REPLACEQ]= replace_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_DELETEQ]= delete_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_INCREMENTQ]= arithmetic_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_DECREMENTQ]= arithmetic_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_QUITQ]= quit_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_FLUSHQ]= flush_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_APPENDQ]= concat_command_handler;
+  interface_v0_impl.interface.v0.comcode[PROTOCOL_BINARY_CMD_PREPENDQ]= concat_command_handler;
+}
index 741ef82e002b863c4679a50fcab015dd7a8e4b8a..86087c5a9b7010140a4de95a0ade3b1e2c5fb72f 100644 (file)
@@ -40,6 +40,7 @@
 #include <libmemcached/protocol_handler.h>
 #include <libmemcached/byteorder.h>
 #include "storage.h"
+#include "memcached_light.h"
 
 extern memcached_binary_protocol_callback_st interface_v0_impl;
 extern memcached_binary_protocol_callback_st interface_v1_impl;
@@ -229,6 +230,12 @@ int main(int argc, char **argv)
   int cmd;
   memcached_binary_protocol_callback_st *interface= &interface_v0_impl;
 
+  /*
+   * We need to initialize the handlers manually due to a bug in the
+   * warnings generated by struct initialization in gcc (all the way up to 4.4)
+   */
+  initialize_iterface_v0_handler();
+
   while ((cmd= getopt(argc, argv, "v1p:?")) != EOF)
   {
     switch (cmd) {
diff --git a/example/memcached_light.h b/example/memcached_light.h
new file mode 100644 (file)
index 0000000..e1ca415
--- /dev/null
@@ -0,0 +1,7 @@
+/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
+#ifndef MEMCACHED_LIGHT_H
+#define MEMCACHED_LIGHT_H
+
+extern void initialize_iterface_v0_handler(void);
+
+#endif
index 27581ec8093cc0ab7f727924e073ece5114edb84..2bafdeb1a445df0378bb4e366a955f1fca2bee3c 100644 (file)
@@ -125,9 +125,10 @@ get_response_handler(const void *cookie,
       .extlen= 4,
       .bodylen= htonl(bodylen + keylen + 4),
     },
-    .message.body.flags= htonl(flags),
   };
 
+  response.message.body.flags= htonl(flags);
+
   protocol_binary_response_status rval;
   const protocol_binary_response_status success= PROTOCOL_BINARY_RESPONSE_SUCCESS;
   if ((rval= client->root->spool(client, response.bytes, sizeof(response.bytes))) != success ||