git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Jeff King <peff@peff.net>
Date
Jul 12, 2021, 20:09 UTC
Message-ID
<YOyhd/odtQxwQk2W@coredump.intra.peff.net>
In-Reply-To
<877dhw4exj.fsf@evledraar.gmail.com>
On Mon, Jul 12, 2021 at 01:05:53AM +0200, Ævar Arnfjörð Bjarmason wrote:
Show 41 quoted lines
> 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...

I don't think there's a general standard-C way to override the macro temporarily. You could perhaps fix it with re-ordering, but it is super-awkward in this case (mingw stuff clearly should go in git-compat-util.h or its includes, and the strbuf declaration should come after that).

Gcc at least supports __strftime__ in the attribute, so that could be an option (I've no clue how portable that is, though).

I'm skeptical on the utility of this strftime format checking in the first place, though. The printf one is matching up the format string with the otherwise-unchecked variable-length parameter list. That's very easy to get wrong, very bad if we do get it wrong, and very hard for anybody but the compiler to check accurately.

But a typo in the strftime placeholders is really no more interesting than a typo in any other error message. If it helps even some obscure cases it might be worth it, but:

  - we almost never feed a string literal anyway (and unlike printf,
    feeding non-literals is not dangerous). And in the one literal case
    you touched in the next patch, we had to make the code uglier to
    enable the checking.
  - as you note, this function isn't even a true strftime() replacement
    anyway. We allow %z, and I would not be at all opposed to adding
    more custom bits (either something regular strftime doesn't support
    at all, or extensions that are not universally available and we have
    to provide a fallback for).
  - it creates the macro headache you saw
  - I'm not sure if it creates other portability concerns. Does
    everybody who supports the format attribute support the strftime
    archetype? I have no clue.
So it doesn't really seem to be to be worth it on balance.
-Peff
Previous: Ævar Arnfjörð BjarmasonNext: Jeff King
Message 14 of 33 in “add missing __attribute__((format))”
  1. 0/6 add missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 10, 2021
  2. 1/6 *.c static functions: don't forward-declare __attribute__Ævar Arnfjörð Bjarmason, Jul 10, 2021
  3. 3/6 *.c static functions: add missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 10, 2021
  4. 5/6 bugreport.c: tweak cmd_bugreport() to use __attribute__((printf))Ævar Arnfjörð Bjarmason, Jul 10, 2021
  5. Junio C HamanoJul 12, 2021
  6. 2/6 sequencer.c: move static function to avoid forward declÆvar Arnfjörð Bjarmason, Jul 10, 2021
  7. 6/6 git-compat-util.h: add __attribute__((printf)) to git_*printf*Ævar Arnfjörð Bjarmason, Jul 10, 2021
  8. Jeff KingJul 12, 2021
  9. Randall S. BeckerJul 12, 2021
  10. Jeff KingJul 12, 2021
  11. Randall S. BeckerJul 12, 2021
  12. 4/6 *.h: add a few missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 10, 2021
  13. Ævar Arnfjörð BjarmasonJul 11, 2021
  14. Jeff KingJul 12, 2021
  15. Jeff KingJul 12, 2021
  16. 0/6 add missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 13, 2021
  17. 1/6 *.c static functions: don't forward-declare __attribute__Ævar Arnfjörð Bjarmason, Jul 13, 2021
  18. 2/6 sequencer.c: move static function to avoid forward declÆvar Arnfjörð Bjarmason, Jul 13, 2021
  19. 3/6 *.c static functions: add missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 13, 2021
  20. 4/6 *.h: add a few missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 13, 2021
  21. 5/6 advice.h: add missing __attribute__((format)) & fix usageÆvar Arnfjörð Bjarmason, Jul 13, 2021
  22. 6/6 strbuf.h: add a comment about "missing" strftime() checkingÆvar Arnfjörð Bjarmason, Jul 13, 2021
  23. Jeff KingJul 13, 2021
  24. Jeff KingJul 13, 2021
  25. Junio C HamanoJul 13, 2021
  26. Ævar Arnfjörð BjarmasonJul 13, 2021
  27. 0/5 add missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 14, 2021
  28. 1/5 *.c static functions: don't forward-declare __attribute__Ævar Arnfjörð Bjarmason, Jul 14, 2021
  29. 2/5 sequencer.c: move static function to avoid forward declÆvar Arnfjörð Bjarmason, Jul 14, 2021
  30. 3/5 *.c static functions: add missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 14, 2021
  31. 5/5 advice.h: add missing __attribute__((format)) & fix usageÆvar Arnfjörð Bjarmason, Jul 14, 2021
  32. 4/5 *.h: add a few missing __attribute__((format))Ævar Arnfjörð Bjarmason, Jul 14, 2021
  33. Junio C HamanoJul 14, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.