Oh my, that is ugly. Is there no way to make this prettier? Anyhow, looks like a good patch, why not send a pull request.
-Pieter On Wed, Mar 14, 2012 at 4:54 PM, Stephen Hemminger <[email protected]> wrote: > 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 * > _______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
