[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: new module 'printf-posix'
From: |
Bruno Haible |
Subject: |
Re: new module 'printf-posix' |
Date: |
Sat, 10 Mar 2007 12:25:31 +0100 |
User-agent: |
KMail/1.5.4 |
Eric Blake wrote:
> shouldn't all the rpl_*printf variant
> declarations be given a printf attribute when available so that users of
> the *printf-posix modules still get the benefits of gcc format string
> checking?
Good idea. I'm applying this:
2007-03-10 Bruno Haible <address@hidden>
* lib/stdio_.h (__attribute__): New macro.
(fprintf, vfprintf, printf, vprintf, snprintf, vsnprintf, sprintf,
vsprintf): Specify __attribute__ __format__ for GCC.
Suggested by Eric Blake.
*** lib/stdio_.h 10 Mar 2007 11:20:32 -0000 1.12
--- lib/stdio_.h 10 Mar 2007 11:21:05 -0000
***************
*** 31,36 ****
--- 31,49 ----
#include <stdarg.h>
#include <stddef.h>
+ #ifndef __attribute__
+ /* This feature is available in gcc versions 2.5 and later. */
+ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+ # 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
+
/* The definition of GL_LINK_WARNING is copied here. */
***************
*** 43,49 ****
#if @GNULIB_FPRINTF_POSIX@
# if @REPLACE_FPRINTF@
# define fprintf rpl_fprintf
! extern int fprintf (FILE *fp, const char *format, ...);
# endif
#elif defined GNULIB_POSIXCHECK
# undef fprintf
--- 56,63 ----
#if @GNULIB_FPRINTF_POSIX@
# if @REPLACE_FPRINTF@
# define fprintf rpl_fprintf
! extern int fprintf (FILE *fp, const char *format, ...)
! __attribute__ ((__format__ (__printf__, 2, 3)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef fprintf
***************
*** 57,63 ****
#if @GNULIB_VFPRINTF_POSIX@
# if @REPLACE_VFPRINTF@
# define vfprintf rpl_vfprintf
! extern int vfprintf (FILE *fp, const char *format, va_list args);
# endif
#elif defined GNULIB_POSIXCHECK
# undef vfprintf
--- 71,78 ----
#if @GNULIB_VFPRINTF_POSIX@
# if @REPLACE_VFPRINTF@
# define vfprintf rpl_vfprintf
! extern int vfprintf (FILE *fp, const char *format, va_list args)
! __attribute__ ((__format__ (__printf__, 2, 0)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef vfprintf
***************
*** 72,78 ****
# if @REPLACE_PRINTF@
/* Don't break __attribute__((format(printf,M,N))). */
# define printf __printf__
! extern int printf (const char *format, ...);
# endif
#elif defined GNULIB_POSIXCHECK
# undef printf
--- 87,94 ----
# if @REPLACE_PRINTF@
/* Don't break __attribute__((format(printf,M,N))). */
# define printf __printf__
! extern int printf (const char *format, ...)
! __attribute__ ((__format__ (__printf__, 1, 2)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef printf
***************
*** 93,99 ****
#if @GNULIB_VPRINTF_POSIX@
# if @REPLACE_VPRINTF@
# define vprintf rpl_vprintf
! extern int vprintf (const char *format, va_list args);
# endif
#elif defined GNULIB_POSIXCHECK
# undef vprintf
--- 109,116 ----
#if @GNULIB_VPRINTF_POSIX@
# if @REPLACE_VPRINTF@
# define vprintf rpl_vprintf
! extern int vprintf (const char *format, va_list args)
! __attribute__ ((__format__ (__printf__, 1, 0)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef vprintf
***************
*** 109,115 ****
# define snprintf rpl_snprintf
# endif
# if @REPLACE_SNPRINTF@ || address@hidden@
! extern int snprintf (char *str, size_t size, const char *format, ...);
# endif
#elif defined GNULIB_POSIXCHECK
# undef snprintf
--- 126,133 ----
# define snprintf rpl_snprintf
# endif
# if @REPLACE_SNPRINTF@ || address@hidden@
! extern int snprintf (char *str, size_t size, const char *format, ...)
! __attribute__ ((__format__ (__printf__, 3, 4)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef snprintf
***************
*** 124,130 ****
# define vsnprintf rpl_vsnprintf
# endif
# if @REPLACE_VSNPRINTF@ || address@hidden@
! extern int vsnprintf (char *str, size_t size, const char *format, va_list
args);
# endif
#elif defined GNULIB_POSIXCHECK
# undef vsnprintf
--- 142,149 ----
# define vsnprintf rpl_vsnprintf
# endif
# if @REPLACE_VSNPRINTF@ || address@hidden@
! extern int vsnprintf (char *str, size_t size, const char *format, va_list
args)
! __attribute__ ((__format__ (__printf__, 3, 0)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef vsnprintf
***************
*** 137,143 ****
#if @GNULIB_SPRINTF_POSIX@
# if @REPLACE_SPRINTF@
# define sprintf rpl_sprintf
! extern int sprintf (char *str, const char *format, ...);
# endif
#elif defined GNULIB_POSIXCHECK
# undef sprintf
--- 156,163 ----
#if @GNULIB_SPRINTF_POSIX@
# if @REPLACE_SPRINTF@
# define sprintf rpl_sprintf
! extern int sprintf (char *str, const char *format, ...)
! __attribute__ ((__format__ (__printf__, 2, 3)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef sprintf
***************
*** 151,157 ****
#if @GNULIB_VSPRINTF_POSIX@
# if @REPLACE_VSPRINTF@
# define vsprintf rpl_vsprintf
! extern int vsprintf (char *str, const char *format, va_list args);
# endif
#elif defined GNULIB_POSIXCHECK
# undef vsprintf
--- 171,178 ----
#if @GNULIB_VSPRINTF_POSIX@
# if @REPLACE_VSPRINTF@
# define vsprintf rpl_vsprintf
! extern int vsprintf (char *str, const char *format, va_list args)
! __attribute__ ((__format__ (__printf__, 2, 0)));
# endif
#elif defined GNULIB_POSIXCHECK
# undef vsprintf