From 232af382e563fcbe15589a3ccae7d6908a17c44d Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 30 Jun 2015 22:28:41 +0200 Subject: [PATCH] Flag the L_() function with attribute format_arg. * agent/agent.h (LunderscorePROTO): New. * common/util.h (GNUPG_GCC_ATTR_FORMAT_ARG): New. * common/i18n.h (GNUPG_GCC_ATTR_FORMAT_ARG): New. Use for i18n_localegettext. Expand LunderscorePROTO. * agent/genkey.c (check_passphrase_constraints): Use xtryasprintf again to keep the old translations. -- Signed-off-by: Werner Koch --- agent/agent.h | 4 ++++ agent/genkey.c | 5 +++-- common/i18n.h | 12 +++++++++++- common/util.h | 8 ++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/agent/agent.h b/agent/agent.h index 70d63cf5d..2948bff76 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -301,6 +301,10 @@ typedef int (*lookup_ttl_t)(const char *hexgrip); the connection. The macro LunderscoreIMPL is used by i18n to actually define the inline function when needed. */ #define L_(a) agent_Lunderscore (ctrl, (a)) +#define LunderscorePROTO \ + static inline const char *agent_Lunderscore (ctrl_t ctrl, \ + const char *string) \ + GNUPG_GCC_ATTR_FORMAT_ARG(2); #define LunderscoreIMPL \ static inline const char * \ agent_Lunderscore (ctrl_t ctrl, const char *string) \ diff --git a/agent/genkey.c b/agent/genkey.c index b5dee8ee5..df17880c9 100644 --- a/agent/genkey.c +++ b/agent/genkey.c @@ -271,8 +271,9 @@ check_passphrase_constraints (ctrl_t ctrl, const char *pw, goto leave; } - msg3 = xtrystrdup (L_("A passphrase may not be a known term or match%0A" - "certain pattern.")); + msg3 = xtryasprintf + (L_("A passphrase may not be a known term or match%%0A" + "certain pattern.")); if (!msg3) { err = gpg_error_from_syserror (); diff --git a/common/i18n.h b/common/i18n.h index 8507b8f27..45710b2cc 100644 --- a/common/i18n.h +++ b/common/i18n.h @@ -38,14 +38,24 @@ # endif #endif /*!USE_SIMPLE_GETTEXT*/ +#ifndef GNUPG_GCC_ATTR_FORMAT_ARG +#if __GNUC__ >= 3 /* Actually 2.8 but testing the major is easier. */ +# define GNUPG_GCC_ATTR_FORMAT_ARG(a) __attribute__ ((__format_arg__ (a))) +#else +# define GNUPG_GCC_ATTR_FORMAT_ARG(a) +#endif +#endif + void i18n_init (void); char *i18n_switchto_utf8 (void); void i18n_switchback (char *saved_codeset); const char *i18n_utf8 (const char *string); -const char *i18n_localegettext (const char *lc_messages, const char *string); +const char *i18n_localegettext (const char *lc_messages, const char *string) + GNUPG_GCC_ATTR_FORMAT_ARG(2); /* If a module wants a local L_() fucntion we define it here. */ #ifdef LunderscoreIMPL +LunderscorePROTO LunderscoreIMPL #endif diff --git a/common/util.h b/common/util.h index d5ddc1f13..b92d78c4d 100644 --- a/common/util.h +++ b/common/util.h @@ -153,6 +153,14 @@ /* GCC attributes. */ +#ifndef GNUPG_GCC_ATTR_FORMAT_ARG +#if __GNUC__ >= 3 /* Actually 2.8 but testing the major is easier. */ +# define GNUPG_GCC_ATTR_FORMAT_ARG(a) __attribute__ ((__format_arg__ (a))) +#else +# define GNUPG_GCC_ATTR_FORMAT_ARG(a) +#endif +#endif + #if __GNUC__ >= 4 # define GNUPG_GCC_A_SENTINEL(a) __attribute__ ((sentinel(a))) #else