Subject: Re: [PATCH 4/6] *.h: add a few missing __attribute__((format))

From: Ævar Arnfjörð Bjarmason <[email-masked]>
Date: Mon, 12 Jul 2021 01:05:53 +0200

On Sat, Jul 10 2021, Ævar Arnfjörð Bjarmason wrote:

So this:
> [...]
> For strbuf_addftime() let's add a strftime() format checker. Our
> function understands the non-portable %z and %Z, see
> c3fbf81a853 (strbuf: let strbuf_addftime handle %z and %Z itself,
> 2017-06-15).
>
> That might be an issue in theory, but in practice we have existing
> codepath that supplies a fixed string to strbuf_addftime(). We're
> unlikely to run into the "%z" and "%Z" case at all, since it's used by
> date.c and passed via e.g. "git log --date=<format>".
> [...]
>  /**
> @@ -425,6 +426,7 @@ void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap);
>   * `suppress_tz_name`, when set, expands %Z internally to the empty
>   * string rather than passing it to `strftime`.
>   */
> +__attribute__((format (strftime, 2, 0)))
>  void strbuf_addftime(struct strbuf *sb, const char *fmt,
>  		    const struct tm *tm, int tz_offset,
>  		    int suppress_tz_name);

Fails with compat/mingw.[ch] doing:

    [...]
    compat/mingw.c:#undef strftime
    compat/mingw.c-size_t mingw_strftime(char *s, size_t max,
    compat/mingw.c-               const char *format, const struct tm *tm)
    [...]
    compat/mingw.h:#define strftime mingw_strftime
    [...]

What's a good macro idiom to dig oneself out of that hole? The only
similar thing I could find was NORETURN in git-compat-util.h being
defined differently on various platforms, and then things like:

	+#if !defined(__MINGW32__) && !defined(_MSC_VER)
	 __attribute__((format (strftime, 2, 0)))
	+#endif

Which seems to work, and may be the simplest workaround...