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(a)meyering.net>
* 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);