Hello, I noticed that there are a few printf-like functions here, but that they don't benefit from gcc's format-string vs. arg-type checking. Here's a patch to enable that: However, to make it portable to non-gcc systems, this block of cpp directives needs to go somewhere (maybe libvirt.h?) so it'll be used from both files. #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif 2006-03-25 Jim Meyering <jim@xxxxxxxxxxxx> * src/virsh.c (vshPrint, vshError): Add gcc's __printf__ attribute. * src/xml.h (virBufferVSprintf): Likewise. Index: src/xml.h =================================================================== RCS file: /data/cvs/libvirt/src/xml.h,v retrieving revision 1.3 diff -u -p -r1.3 xml.h --- src/xml.h 15 Mar 2006 12:13:25 -0000 1.3 +++ src/xml.h 25 Mar 2006 10:56:27 -0000 @@ -25,7 +25,8 @@ extern "C" { }; int virBufferAdd(virBufferPtr buf, const char *str, int len); - int virBufferVSprintf(virBufferPtr buf, const char *format, ...); + int virBufferVSprintf(virBufferPtr buf, const char *format, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); char *virDomainParseXMLDesc(const char *xmldesc, char **name); #ifdef __cplusplus Index: src/virsh.c =================================================================== RCS file: /data/cvs/libvirt/src/virsh.c,v retrieving revision 1.21 diff -u -p -r1.21 virsh.c --- src/virsh.c 15 Mar 2006 12:13:25 -0000 1.21 +++ src/virsh.c 25 Mar 2006 10:56:28 -0000 @@ -177,8 +177,8 @@ typedef struct __vshControl { static vshCmdDef commands[]; -static void vshError(vshControl * ctl, int doexit, const char *format, - ...); +static void vshError(vshControl * ctl, int doexit, const char *format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); static int vshInit(vshControl * ctl); static int vshDeinit(vshControl * ctl); static void vshUsage(vshControl * ctl, const char *cmdname); @@ -198,8 +198,9 @@ static virDomainPtr vshCommandOptDomain( const char *optname, char **name); -static void vshPrint(vshControl * ctl, vshOutType out, const char *format, - ...); +static void vshPrint(vshControl * ctl, vshOutType out, const char *format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); + ; static const char *vshDomainStateToString(int state);