[zeromq-dev] [RFC] czmq: check printf format options

Stephen Hemminger shemminger at vyatta.com
Wed Mar 14 22:54:47 CET 2012


Add checking of zmsg and zsocket arguments that take printf formats
    
Gcc has support for attributes that trap errors in format strings at
compile time. Not highly esthetic but it works.


diff --git a/include/zmsg.h b/include/zmsg.h
index bf866ff..d0d6fcd 100644
--- a/include/zmsg.h
+++ b/include/zmsg.h
@@ -27,6 +27,15 @@
 #ifndef __ZMSG_H_INCLUDED__
 #define __ZMSG_H_INCLUDED__
 
+// If using GCC this causes checking of syntax of format strings
+#ifndef GCC_PRINTFLIKE
+#ifdef __GNUC__
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -84,12 +93,14 @@ int
 //  Push string as new frame to front of message.
 //  Returns 0 on success, -1 on error.
 int
-    zmsg_pushstr (zmsg_t *self, const char *format, ...);
+    zmsg_pushstr (zmsg_t *self, const char *format, ...)
+	GCC_PRINTFLIKE(2,3);
 
 //  Push string as new frame to end of message.
 //  Returns 0 on success, -1 on error.
 int
-    zmsg_addstr (zmsg_t *self, const char *format, ...);
+    zmsg_addstr (zmsg_t *self, const char *format, ...)
+	GCC_PRINTFLIKE(2,3);
 
 //  Pop frame off front of message, return as fresh string
 char *
diff --git a/include/zsocket.h b/include/zsocket.h
index 8e7b993..7737888 100644
--- a/include/zsocket.h
+++ b/include/zsocket.h
@@ -27,10 +27,20 @@
 #ifndef __ZSOCKET_H_INCLUDED__
 #define __ZSOCKET_H_INCLUDED__
 
+/* Macro for usage of GCC's printf compilation warnings */
+#ifndef GCC_PRINTFLIKE
+#ifdef __GNUC__
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+
 //  @interface
 //  This port range is defined by IANA for dynamic or private ports
 //  We use this when choosing a port for dynamic binding.
@@ -54,12 +64,14 @@ void
 //  bind succeeded with the specified port number. Always returns the
 //  port number if successful.
 int
-    zsocket_bind (void *socket, const char *format, ...);
+    zsocket_bind (void *socket, const char *format, ...)
+	GCC_PRINTFLIKE(2,3);
 
 //  Connect a socket to a formatted endpoint
 //  Returns 0 if OK, -1 if the endpoint was invalid.
 int
-    zsocket_connect (void *socket, const char *format, ...);
+    zsocket_connect (void *socket, const char *format, ...)
+	GCC_PRINTFLIKE(2,3);
 
 //  Returns socket type as printable constant string
 char *



More information about the zeromq-dev mailing list