Generalize WX_ATTRIBUTE_PRINTF to WX_ATTRIBUTE_FORMAT

Allow applying gcc "format" attribute to other functions and do apply it
to wxStrftime().

Also suppress -Wformat-nonliteral inside wxStrftime() itself, as it's
now supposed to be checked when calling it.
This commit is contained in:
Vadim Zeitlin 2020-08-30 22:26:34 +02:00
parent 7352a2879c
commit 36c5884acb
2 changed files with 15 additions and 6 deletions

View File

@ -542,12 +542,14 @@ typedef short int WXTYPE;
/* ---------------------------------------------------------------------------- */
/* Printf-like attribute definitions to obtain warnings with GNU C/C++ */
#if defined(__GNUC__) && !wxUSE_UNICODE
# define WX_ATTRIBUTE_FORMAT(like, m, n) __attribute__ ((__format__ (like, m, n)))
#else
# define WX_ATTRIBUTE_FORMAT(like, m, n)
#endif
#ifndef WX_ATTRIBUTE_PRINTF
# if defined(__GNUC__) && !wxUSE_UNICODE
# define WX_ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
# else
# define WX_ATTRIBUTE_PRINTF(m, n)
# endif
# define WX_ATTRIBUTE_PRINTF(m, n) WX_ATTRIBUTE_FORMAT(__printf__, m, n)
# define WX_ATTRIBUTE_PRINTF_1 WX_ATTRIBUTE_PRINTF(1, 2)
# define WX_ATTRIBUTE_PRINTF_2 WX_ATTRIBUTE_PRINTF(2, 3)

View File

@ -1052,9 +1052,16 @@ inline wchar_t* wxGetenv(const wxScopedWCharBuffer& name) { return wxCRT_GetenvW
// ----------------------------------------------------------------------------
#ifndef wxNO_IMPLICIT_WXSTRING_ENCODING
WX_ATTRIBUTE_FORMAT(__strftime__, 3, 4)
inline size_t wxStrftime(char *s, size_t max,
const wxString& format, const struct tm *tm)
{ return wxCRT_StrftimeA(s, max, format.mb_str(), tm); }
{
wxGCC_ONLY_WARNING_SUPPRESS(format-nonliteral)
return wxCRT_StrftimeA(s, max, format.mb_str(), tm);
wxGCC_ONLY_WARNING_RESTORE(format-nonliteral)
}
#endif // wxNO_IMPLICIT_WXSTRING_ENCODING
inline size_t wxStrftime(wchar_t *s, size_t max,