[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libvir] use gcc's printf __attribute__



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 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]