From: Bruno Haible Date: Wed, 28 May 2025 13:14:07 +0000 (+0200) Subject: gettext-h: Avoid gcc -Wformat-security warnings with --disable-nls. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e5015dd557b20ae4a0829c4bf78480ce2f4cb04;p=thirdparty%2Fgnulib.git gettext-h: Avoid gcc -Wformat-security warnings with --disable-nls. Reported by Holger Hoffstätte in . * lib/gettext.h (gettext, dgettext, dcgettext): With gcc in C mode, define these as inline functions. * lib/sigpipe-die.c (sigpipe_die): Use translated string as a format string, relying on the format string checking done by 'msgfmt -c'. * lib/xmemcoll.c (collate_error): Revert commit from 2025-01-17. * lib/xprintf.c (xvprintf, xvfprintf): Likewise. * lib/openat-die.c (openat_save_fail, openat_restore_fail): Revert commit from 2024-12-10. --- diff --git a/ChangeLog b/ChangeLog index d14ec6f717..fb13633936 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2025-05-28 Bruno Haible + + gettext-h: Avoid gcc -Wformat-security warnings with --disable-nls. + Reported by Holger Hoffstätte in + . + * lib/gettext.h (gettext, dgettext, dcgettext): With gcc in C mode, + define these as inline functions. + * lib/sigpipe-die.c (sigpipe_die): Use translated string as a format + string, relying on the format string checking done by 'msgfmt -c'. + * lib/xmemcoll.c (collate_error): Revert commit from 2025-01-17. + * lib/xprintf.c (xvprintf, xvfprintf): Likewise. + * lib/openat-die.c (openat_save_fail, openat_restore_fail): Revert + commit from 2024-12-10. + 2025-05-27 Bruno Haible stddef-h: Make 'unreachable' usable in C++ mode. diff --git a/lib/gettext.h b/lib/gettext.h index ea0c27e000..bb3d9755de 100644 --- a/lib/gettext.h +++ b/lib/gettext.h @@ -59,18 +59,43 @@ # endif # endif -/* Disabled NLS. - The casts to 'const char *' serve the purpose of producing warnings - for invalid uses of the value returned from these functions. - On pre-ANSI systems without 'const', the config.h file is supposed to - contain "#define const". */ -# undef gettext -# define gettext(Msgid) ((const char *) (Msgid)) -# undef dgettext -# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) -# undef dcgettext -# define dcgettext(Domainname, Msgid, Category) \ - ((void) (Category), dgettext (Domainname, Msgid)) +/* Disabled NLS. */ +# if defined __GNUC__ && !defined __clang__ && !defined __cplusplus +/* Use inline functions, to avoid warnings + warning: format not a string literal and no format arguments + that don't occur with enabled NLS. */ +__attribute__ ((__always_inline__, __gnu_inline__)) extern inline +const char * +gettext (const char *msgid) +{ + return msgid; +} +__attribute__ ((__always_inline__, __gnu_inline__)) extern inline +const char * +dgettext (const char *domain, const char *msgid) +{ + (void) domain; + return msgid; +} +__attribute__ ((__always_inline__, __gnu_inline__)) extern inline +const char * +dcgettext (const char *domain, const char *msgid, int category) +{ + (void) domain; + (void) category; + return msgid; +} +# else +/* The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. */ +# undef gettext +# define gettext(Msgid) ((const char *) (Msgid)) +# undef dgettext +# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) +# undef dcgettext +# define dcgettext(Domainname, Msgid, Category) \ + ((void) (Category), dgettext (Domainname, Msgid)) +# endif # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ diff --git a/lib/openat-die.c b/lib/openat-die.c index 3fbb5d86e4..79a5b23bc8 100644 --- a/lib/openat-die.c +++ b/lib/openat-die.c @@ -34,7 +34,7 @@ _Noreturn void openat_save_fail (int errnum) { #ifndef GNULIB_LIBPOSIX - error (exit_failure, errnum, "%s", + error (exit_failure, errnum, _("unable to record current working directory")); #endif /* _Noreturn cannot be applied to error, since it returns @@ -53,7 +53,7 @@ _Noreturn void openat_restore_fail (int errnum) { #ifndef GNULIB_LIBPOSIX - error (exit_failure, errnum, "%s", + error (exit_failure, errnum, _("failed to return to initial working directory")); #endif diff --git a/lib/sigpipe-die.c b/lib/sigpipe-die.c index 006f3b1636..ddd05cd49c 100644 --- a/lib/sigpipe-die.c +++ b/lib/sigpipe-die.c @@ -33,7 +33,7 @@ void sigpipe_die (void) { - error (exit_failure, 0, "%s", + error (exit_failure, 0, _("error writing to a closed pipe or socket")); /* Ensure that this function really does not return. */ diff --git a/lib/xmemcoll.c b/lib/xmemcoll.c index c0ac7c4863..d1b141c9e0 100644 --- a/lib/xmemcoll.c +++ b/lib/xmemcoll.c @@ -36,8 +36,8 @@ collate_error (int collation_errno, char const *s1, size_t s1len, char const *s2, size_t s2len) { - error (0, collation_errno, "%s", _("string comparison failed")); - error (0, 0, "%s", _("Set LC_ALL='C' to work around the problem.")); + error (0, collation_errno, _("string comparison failed")); + error (0, 0, _("Set LC_ALL='C' to work around the problem.")); error (exit_failure, 0, _("The strings compared were %s and %s."), quotearg_n_style_mem (0, locale_quoting_style, s1, s1len), diff --git a/lib/xprintf.c b/lib/xprintf.c index 4d9a3e5e4d..790af5320b 100644 --- a/lib/xprintf.c +++ b/lib/xprintf.c @@ -45,7 +45,7 @@ xvprintf (char const *restrict format, va_list args) { off64_t retval = vzprintf (format, args); if (retval < 0 && ! ferror (stdout)) - error (exit_failure, errno, "%s", _("cannot perform formatted output")); + error (exit_failure, errno, _("cannot perform formatted output")); return retval; } @@ -67,7 +67,7 @@ xvfprintf (FILE *restrict stream, char const *restrict format, va_list args) { off64_t retval = vfzprintf (stream, format, args); if (retval < 0 && ! ferror (stream)) - error (exit_failure, errno, "%s", _("cannot perform formatted output")); + error (exit_failure, errno, _("cannot perform formatted output")); return retval; }