From ccc71e0ea881b7f6594ed95afd706442829c39fc Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Sun, 13 Sep 2015 06:29:04 +0000 Subject: [PATCH] add format argument attributes to gettext function prototypes their absence completely breaks format string warnings in programs with gettext message translations: -Wformat gives no results, and -Wformat-nonliteral produces spurious warnings. with gcc, the problem manifests only in standards-conforming profiles; otherwise gcc sets these attributes by default for the gettext family. with clang, the problem always manifests; clang has no such defaults. --- include/libintl.h | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/include/libintl.h b/include/libintl.h index a2dada67..6a707bf0 100644 --- a/include/libintl.h +++ b/include/libintl.h @@ -8,16 +8,24 @@ extern "C" { #define __USE_GNU_GETTEXT 1 #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 1 : -1) -char *gettext(const char *); -char *dgettext(const char *, const char *); -char *dcgettext(const char *, const char *, int); -char *ngettext(const char *, const char *, unsigned long); -char *dngettext(const char *, const char *, const char *, unsigned long); -char *dcngettext(const char *, const char *, const char *, unsigned long, int); +#if __GNUC__ >= 3 +#define __fa(n) __attribute__ ((__format_arg__ (n))) +#else +#define __fa(n) +#endif + +char *gettext(const char *) __fa(1); +char *dgettext(const char *, const char *) __fa(2); +char *dcgettext(const char *, const char *, int) __fa(2); +char *ngettext(const char *, const char *, unsigned long) __fa(1) __fa(2); +char *dngettext(const char *, const char *, const char *, unsigned long) __fa(2) __fa(3); +char *dcngettext(const char *, const char *, const char *, unsigned long, int) __fa(2) __fa(3); char *textdomain(const char *); char *bindtextdomain (const char *, const char *); char *bind_textdomain_codeset(const char *, const char *); +#undef __fa + #ifdef __cplusplus } #endif -- 2.25.1