|
From: Bart V. A. <bar...@gm...> - 2007-09-26 06:52:34
|
In my opinion enabling gcc's format argument checking for Valgrind source code is a bad idea: Valgrind's format specifications are not identical to the ANSI C format specifications. Valgrind e.g. supports format specifications like "%,d", which are not allowed by ANSI C. For an example of code that uses this kind of format specifications, see e.g. memcheck/mc_malloc_wrappers.c. Bart. On 9/24/07, sv...@va... < sv...@va...> wrote: > > Author: dirk > Date: 2007-09-24 14:25:24 +0100 (Mon, 24 Sep 2007) > New Revision: 6909 > > Log: > add format argument checking. might find useful portability issues > > Modified: > trunk/include/pub_tool_libcprint.h > > > Modified: trunk/include/pub_tool_libcprint.h > =================================================================== > --- trunk/include/pub_tool_libcprint.h 2007-09-24 13:24:50 UTC (rev 6908) > +++ trunk/include/pub_tool_libcprint.h 2007-09-24 13:25:24 UTC (rev 6909) > > @@ -35,19 +35,26 @@ > Basic printing > ------------------------------------------------------------------ */ > > +#ifdef __GNUC__ > +# define PRINTF_CHECK(x,y) __attribute__((format(__printf__, x, y))) > +#else > +# define PRINTF_CHECK(x,y) /* x, y */ > +#endif > + > /* Note that they all output to the file descriptor given by the > * --log-fd/--log-file/--log-socket argument, which defaults to 2 > (stderr). > * Hence no need for VG_(fprintf)(). > */ > -extern UInt VG_(printf) ( const HChar *format, ... ); > + > +extern UInt VG_(printf) ( const HChar *format, ... ) PRINTF_CHECK(1,2); > extern UInt VG_(vprintf) ( const HChar *format, va_list vargs ); > /* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */ > > -extern UInt VG_(sprintf) ( Char* buf, const HChar* format, ... ); > +extern UInt VG_(sprintf) ( Char* buf, const HChar* format, ... ) > PRINTF_CHECK(2,3); > extern UInt VG_(vsprintf) ( Char* buf, const HChar* format, va_list vargs > ); > > extern UInt VG_(snprintf) ( Char* buf, Int size, > - const HChar *format, ... ); > + const HChar *format, ... ) > PRINTF_CHECK(3,4); > extern UInt VG_(vsnprintf)( Char* buf, Int size, > const HChar *format, va_list vargs > ); > |