From: Viktor Szakats Date: Thu, 22 Aug 2024 08:54:42 +0000 (+0200) Subject: printf: fix mingw-w64 format checks X-Git-Tag: curl-8_10_0~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e512fbfa6752705b2f941c79c2b8e2dfbe93d28a;p=thirdparty%2Fcurl.git printf: fix mingw-w64 format checks Change mingw-w64 printf format checks in public curl headers to use `__MINGW_PRINTF_FORMAT` instead of `gnu_printf`. This syncs the format checker with format string macros published via `curl/system.h`. (Also disable format checks for mingw-w64 older than 3.0.0 (2013-09-20) and classic-mingw, which do not support this macro.) This fixes bogus format checker `-Wformat` warnings in 3rd party code using curl format strings with the curl printf functions, when using mingw-w64 7.0.0 (2019-11-10) and older (with GCC, MSVCRT). It also allows to delete two workaounds for this within curl itself: - setting `-D__USE_MINGW_ANSI_STDIO=1` for mingw-w64 via cmake and configure for `docs/examples` and `tests/http/clients`. Ref: c730c8549b5b67e7668ca5d2cd82c3cc183e125d #14640 The format check macro is incompatible (depending on mingw-w64 version and configuration) with the C99 `%z` (`size_t`) format string used internally by curl. To work around this problem, override the format check style in curl public headers to use `gnu_printf`. This is compatible with `%z` in all mingw-w64 versions and allows keeping the C99 format strings internally. Also: - lib/ws.c: add missing space to an error message. - docs/examples/ftpgetinfo.c: fix to use standard printf. Ref: #14643 (take 1) Follow-up to 3829759bd042c03225ae862062560f568ba1a231 #12489 Closes #14703 --- diff --git a/configure.ac b/configure.ac index 6db5e6b5af..6bf47e2cf9 100644 --- a/configure.ac +++ b/configure.ac @@ -597,16 +597,6 @@ case $host_os in ;; esac -have_mingw='no' -case $host_os in - mingw*) - have_mingw='yes' - ;; -esac - -AM_CONDITIONAL([HAVE_MINGW], - [test "$curl_cv_native_windows" = 'yes' -a "$have_mingw" = 'yes']) - AM_CONDITIONAL([HAVE_WINDRES], [test "$curl_cv_native_windows" = "yes" && test -n "${RC}"]) diff --git a/docs/examples/CMakeLists.txt b/docs/examples/CMakeLists.txt index 75784ab501..ea2b8035c7 100644 --- a/docs/examples/CMakeLists.txt +++ b/docs/examples/CMakeLists.txt @@ -34,10 +34,6 @@ foreach(_target IN LISTS check_PROGRAMS) if(LIB_SELECTED STREQUAL LIB_STATIC AND WIN32) set_property(TARGET ${_target_name} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_STATICLIB") endif() - if(MINGW) - # For mingw-w64 7.0.0 and earlier to avoid '-Wformat=' - set_property(TARGET ${_target_name} APPEND PROPERTY COMPILE_DEFINITIONS "__USE_MINGW_ANSI_STDIO=1") - endif() set_target_properties(${_target_name} PROPERTIES OUTPUT_NAME "${_target}" UNITY_BUILD OFF PROJECT_LABEL "Example ${_target}") diff --git a/docs/examples/Makefile.am b/docs/examples/Makefile.am index 8a731f55ff..91f90cf65b 100644 --- a/docs/examples/Makefile.am +++ b/docs/examples/Makefile.am @@ -46,11 +46,6 @@ if USE_CPPFLAG_CURL_STATICLIB AM_CPPFLAGS += -DCURL_STATICLIB endif -if HAVE_MINGW -# For mingw-w64 7.0.0 and earlier to avoid '-Wformat=' -AM_CPPFLAGS += -D__USE_MINGW_ANSI_STDIO=1 -endif - # Prevent LIBS from being used for all link targets LIBS = $(BLANK_AT_MAKETIME) diff --git a/docs/examples/ftpgetinfo.c b/docs/examples/ftpgetinfo.c index f1a3cefd62..be24fa71ef 100644 --- a/docs/examples/ftpgetinfo.c +++ b/docs/examples/ftpgetinfo.c @@ -75,8 +75,8 @@ int main(void) res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &filesize); if((CURLE_OK == res) && (filesize>0)) - curl_mprintf("filesize %s: %" CURL_FORMAT_CURL_OFF_T " bytes\n", - filename, filesize); + printf("filesize %s: %" CURL_FORMAT_CURL_OFF_T " bytes\n", + filename, filesize); } else { /* we failed */ diff --git a/include/curl/curl.h b/include/curl/curl.h index dae533e32d..c4fae4d446 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -3236,7 +3236,9 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); #include "options.h" #include "header.h" #include "websockets.h" +#ifndef CURL_SKIP_INCLUDE_MPRINTF #include "mprintf.h" +#endif /* the typechecker does not work in C++ (yet) */ #if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ diff --git a/include/curl/mprintf.h b/include/curl/mprintf.h index e6bc5bca47..88059c851f 100644 --- a/include/curl/mprintf.h +++ b/include/curl/mprintf.h @@ -32,13 +32,18 @@ extern "C" { #endif +#ifndef CURL_TEMP_PRINTF #if (defined(__GNUC__) || defined(__clang__) || \ defined(__IAR_SYSTEMS_ICC__)) && \ defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !defined(CURL_NO_FMT_CHECKS) #if defined(__MINGW32__) && !defined(__clang__) +#if defined(__MINGW_PRINTF_FORMAT) /* mingw-w64 3.0.0+. Needs stdio.h. */ #define CURL_TEMP_PRINTF(fmt, arg) \ - __attribute__((format(gnu_printf, fmt, arg))) + __attribute__((format(__MINGW_PRINTF_FORMAT, fmt, arg))) +#else +#define CURL_TEMP_PRINTF(fmt, arg) +#endif #else #define CURL_TEMP_PRINTF(fmt, arg) \ __attribute__((format(printf, fmt, arg))) @@ -46,6 +51,7 @@ extern "C" { #else #define CURL_TEMP_PRINTF(fmt, arg) #endif +#endif CURL_EXTERN int curl_mprintf(const char *format, ...) CURL_TEMP_PRINTF(1, 2); diff --git a/lib/curl_printf.h b/lib/curl_printf.h index df752258bf..e851b14a50 100644 --- a/lib/curl_printf.h +++ b/lib/curl_printf.h @@ -29,6 +29,10 @@ * *rintf() functions. */ +#ifndef CURL_TEMP_PRINTF +#error "CURL_TEMP_PRINTF must be set before including curl/mprintf.h" +#endif + #include #define MERR_OK 0 diff --git a/lib/curl_setup.h b/lib/curl_setup.h index dc39bb123e..b6f50fec32 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -28,6 +28,9 @@ #define CURL_NO_OLDIES #endif +/* Tell "curl/curl.h" not to include "curl/mprintf.h" */ +#define CURL_SKIP_INCLUDE_MPRINTF + /* FIXME: Delete this once the warnings have been fixed. */ #if !defined(CURL_WARN_SIGN_CONVERSION) #ifdef __GNUC__ @@ -345,6 +348,9 @@ #define CURL_PRINTF(fmt, arg) #endif +/* Override default printf mask check rules in "curl/mprintf.h" */ +#define CURL_TEMP_PRINTF CURL_PRINTF + /* Workaround for mainline llvm v16 and earlier missing a built-in macro expected by macOS SDK v14 / Xcode v15 (2023) and newer. gcc (as of v14) is also missing it. */ diff --git a/lib/mprintf.c b/lib/mprintf.c index 89cbb87ce4..42993c7177 100644 --- a/lib/mprintf.c +++ b/lib/mprintf.c @@ -25,7 +25,6 @@ #include "curl_setup.h" #include "dynbuf.h" #include "curl_printf.h" -#include #include "curl_memory.h" /* The last #include file should be: */ diff --git a/lib/ws.c b/lib/ws.c index c845f5d3e1..1cfabf4ff4 100644 --- a/lib/ws.c +++ b/lib/ws.c @@ -558,7 +558,7 @@ static ssize_t ws_enc_write_head(struct Curl_easy *data, if(enc->payload_remain > 0) { /* trying to write a new frame before the previous one is finished */ - failf(data, "WS: starting new frame with %zd bytes from last one" + failf(data, "WS: starting new frame with %zd bytes from last one " "remaining to be sent", (ssize_t)enc->payload_remain); *err = CURLE_SEND_ERROR; return -1; diff --git a/tests/http/clients/CMakeLists.txt b/tests/http/clients/CMakeLists.txt index 05fd793fc5..44af35ed3c 100644 --- a/tests/http/clients/CMakeLists.txt +++ b/tests/http/clients/CMakeLists.txt @@ -39,10 +39,6 @@ foreach(_target IN LISTS check_PROGRAMS) if(LIB_SELECTED STREQUAL LIB_STATIC AND WIN32) set_property(TARGET ${_target_name} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_STATICLIB") endif() - if(MINGW) - # For mingw-w64 7.0.0 and earlier to avoid '-Wformat=' - set_property(TARGET ${_target_name} APPEND PROPERTY COMPILE_DEFINITIONS "__USE_MINGW_ANSI_STDIO=1") - endif() set_target_properties(${_target_name} PROPERTIES OUTPUT_NAME "${_target}" UNITY_BUILD OFF PROJECT_LABEL "Test client ${_target}") diff --git a/tests/http/clients/Makefile.am b/tests/http/clients/Makefile.am index e9bdda9f88..007de3c877 100644 --- a/tests/http/clients/Makefile.am +++ b/tests/http/clients/Makefile.am @@ -47,11 +47,6 @@ if USE_CPPFLAG_CURL_STATICLIB AM_CPPFLAGS += -DCURL_STATICLIB endif -if HAVE_MINGW -# For mingw-w64 7.0.0 and earlier to avoid '-Wformat=' -AM_CPPFLAGS += -D__USE_MINGW_ANSI_STDIO=1 -endif - # Prevent LIBS from being used for all link targets LIBS = $(BLANK_AT_MAKETIME)