]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
build: fix compiling with GCC 4.x versions
authorViktor Szakats <commit@vsz.me>
Sat, 11 Jan 2025 23:11:59 +0000 (00:11 +0100)
committerViktor Szakats <commit@vsz.me>
Wed, 22 Jan 2025 10:26:15 +0000 (11:26 +0100)
- silence false positive picky warnings.
- avoid "possible noreturn" warnings for standalone tests and examples.
- fix to compile without `#pragma GCC diagnostic push` support.
- fix "#pragma GCC diagnostic not allowed inside functions".

Prerequisite for #15975 that needs GCC 4.4 for the latest pre-built
CeGCC/mingw32ce toolchain for Windows CE.

Cherry-picked from #15975
Closes #16062

13 files changed:
CMake/PickyWarnings.cmake
docs/examples/cacertinmem.c
docs/examples/sendrecv.c
docs/examples/usercertinmem.c
m4/curl-compilers.m4
tests/http/clients/h2-pausing.c
tests/http/clients/upload-pausing.c
tests/libtest/lib557.c
tests/libtest/test.h
tests/unit/unit1398.c
tests/unit/unit1652.c
tests/unit/unit2604.c
tests/unit/unit3200.c

index 90dcfb633f5267267d9484554ecd5a4a36d81b91..7abba373e609e52ad30cc901c5288f19d9c6af8c 100644 (file)
@@ -236,6 +236,24 @@ if(PICKY_COMPILER)
         list(APPEND _picky "${_ccopt}")
       endif()
     endforeach()
+
+    if(CMAKE_COMPILER_IS_GNUCC)
+      if(CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5)
+        # Avoid false positives
+        list(APPEND _picky "-Wno-shadow")
+        list(APPEND _picky "-Wno-unreachable-code")
+      endif()
+      if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.2 AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.6)
+        # GCC <4.6 do not support #pragma to suppress warnings locally. Disable them globally instead.
+        list(APPEND _picky "-Wno-overlength-strings")
+      endif()
+      if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0 AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7)
+        list(APPEND _picky "-Wno-missing-field-initializers")  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750
+      endif()
+      if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.3 AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8)
+        list(APPEND _picky "-Wno-type-limits")  # Avoid false positives
+      endif()
+    endif()
   endif()
 endif()
 
index d95f0ef21a977fa32f6f2c825170ae80ab6ed861..94080c641ece1121e47ce6eb86055219b37c1983 100644 (file)
 #include <curl/curl.h>
 #include <stdio.h>
 
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic ignored "-Woverlength-strings"
+#endif
+
 static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
 {
   fwrite(ptr, size, nmemb, (FILE *)stream);
@@ -41,11 +45,6 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
 {
   CURLcode rv = CURLE_ABORTED_BY_CALLBACK;
 
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Woverlength-strings"
-#endif
-
   /** This example uses two (fake) certificates **/
   static const char mypem[] =
     "-----BEGIN CERTIFICATE-----\n"
@@ -90,10 +89,6 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
     "Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n"
     "-----END CERTIFICATE-----\n";
 
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
-
   BIO *cbio = BIO_new_mem_buf(mypem, sizeof(mypem));
   X509_STORE  *cts = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
   int i;
index 6215f0ddf2ae151113b5551447f0539d2a96e48f..8cbb5b0722fc98382a309d650a30c4b440ef59d8 100644 (file)
 #include <string.h>
 #include <curl/curl.h>
 
+/* Avoid warning in FD_SET() with pre-2020 Cygwin/MSYS releases:
+ * warning: conversion to 'long unsigned int' from 'curl_socket_t' {aka 'int'}
+ * may change the sign of the result [-Wsign-conversion]
+ */
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#ifdef __DJGPP__
+#pragma GCC diagnostic ignored "-Warith-conversion"
+#endif
+#elif defined(_MSC_VER)
+#pragma warning(disable:4127)  /* conditional expression is constant */
+#endif
+
 /* Auxiliary function that waits on the socket. */
 static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
 {
@@ -49,20 +62,6 @@ static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
   FD_ZERO(&outfd);
   FD_ZERO(&errfd);
 
-/* Avoid this warning with pre-2020 Cygwin/MSYS releases:
- * warning: conversion to 'long unsigned int' from 'curl_socket_t' {aka 'int'}
- * may change the sign of the result [-Wsign-conversion]
- */
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wsign-conversion"
-#if defined(__DJGPP__)
-#pragma GCC diagnostic ignored "-Warith-conversion"
-#endif
-#elif defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4127)  /* conditional expression is constant */
-#endif
   FD_SET(sockfd, &errfd); /* always check for error */
 
   if(for_recv) {
@@ -71,11 +70,6 @@ static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
   else {
     FD_SET(sockfd, &outfd);
   }
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#elif defined(_MSC_VER)
-#pragma warning(pop)
-#endif
 
   /* select() returns the number of signalled sockets or -1 */
   res = select((int)sockfd + 1, &infd, &outfd, &errfd, &tv);
index e8c78fe79e0b318519b547dbd4b277d8292ebf08..75fadfe8f6169f5667e29931d6b9c27d0b7c82ff 100644 (file)
 #include <curl/curl.h>
 #include <stdio.h>
 
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic ignored "-Woverlength-strings"
+#endif
+
 static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
 {
   fwrite(ptr, size, nmemb, stream);
@@ -55,11 +59,6 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
   RSA *rsa = NULL;
   int ret;
 
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Woverlength-strings"
-#endif
-
   const char *mypem = /* www.cacert.org */
     "-----BEGIN CERTIFICATE-----\n"\
     "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\
@@ -124,10 +123,6 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
     "-----END RSA PRIVATE KEY-----\n";
 
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
-
   (void)curl; /* avoid warnings */
   (void)parm; /* avoid warnings */
 
index 4f3168feef8fcfac21d4c9775503c652effaaf45..6f726a9a5f24e3ad6379c629ae24180a2b2070ff 100644 (file)
@@ -1113,6 +1113,23 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
             fi
           fi
         fi
+        if test "$compiler_num" -lt "405"; then
+          dnl Avoid false positives
+          tmp_CFLAGS="$tmp_CFLAGS -Wno-shadow"
+          tmp_CFLAGS="$tmp_CFLAGS -Wno-unreachable-code"
+        fi
+        if test "$compiler_num" -ge "402" -a "$compiler_num" -lt "406"; then
+          dnl GCC <4.6 do not support #pragma to suppress warnings locally. Disable globally instead.
+          tmp_CFLAGS="$tmp_CFLAGS -Wno-overlength-strings"
+        fi
+        if test "$compiler_num" -ge "400" -a "$compiler_num" -lt "407"; then
+          dnl https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84685
+          tmp_CFLAGS="$tmp_CFLAGS -Wno-missing-field-initializers"
+        fi
+        if test "$compiler_num" -ge "403" -a "$compiler_num" -lt "408"; then
+          dnl Avoid false positives
+          tmp_CFLAGS="$tmp_CFLAGS -Wno-type-limits"
+        fi
         ;;
         #
       HP_UX_C)
index 1fd54d4f6375f122c8eeb9d1e6da654ebaa8f3e9..51d937ec315fbaccbb1ab3fbb2e88f5fe072ec64 100644 (file)
@@ -140,11 +140,11 @@ static int debug_cb(CURL *handle, curl_infotype type,
   return 0;
 }
 
-static int err(void)
-{
-  fprintf(stderr, "something unexpected went wrong - bailing out!\n");
-  exit(2);
-}
+#define ERR()                                                             \
+  do {                                                                    \
+    fprintf(stderr, "something unexpected went wrong - bailing out!\n");  \
+    exit(2);                                                              \
+  } while(0)
 
 static void usage(const char *msg)
 {
@@ -292,24 +292,24 @@ int main(int argc, char *argv[])
       curl_easy_setopt(handles[i].h, CURLOPT_RESOLVE, resolve) != CURLE_OK ||
       curl_easy_setopt(handles[i].h, CURLOPT_PIPEWAIT, 1L) ||
       curl_easy_setopt(handles[i].h, CURLOPT_URL, url) != CURLE_OK) {
-      err();
+      ERR();
     }
     curl_easy_setopt(handles[i].h, CURLOPT_HTTP_VERSION, (long)http_version);
   }
 
   multi_handle = curl_multi_init();
   if(!multi_handle)
-    err();
+    ERR();
 
   for(i = 0; i < HANDLECOUNT; i++) {
     if(curl_multi_add_handle(multi_handle, handles[i].h) != CURLM_OK)
-      err();
+      ERR();
   }
 
   for(rounds = 0;; rounds++) {
     fprintf(stderr, "INFO: multi_perform round %d\n", rounds);
     if(curl_multi_perform(multi_handle, &still_running) != CURLM_OK)
-      err();
+      ERR();
 
     if(!still_running) {
       int as_expected = 1;
@@ -343,7 +343,7 @@ int main(int argc, char *argv[])
     }
 
     if(curl_multi_poll(multi_handle, NULL, 0, 100, &numfds) != CURLM_OK)
-      err();
+      ERR();
 
     /* !checksrc! disable EQUALSNULL 1 */
     while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
index ff68b7bd1450d0b4ed075a0fa1de480b4a50b31e..bd3d3eeea49417a6ed6fc42887771fce9c829690 100644 (file)
@@ -180,11 +180,11 @@ static int progress_callback(void *clientp,
   return 0;
 }
 
-static int err(void)
-{
-  fprintf(stderr, "something unexpected went wrong - bailing out!\n");
-  exit(2);
-}
+#define ERR()                                                             \
+  do {                                                                    \
+    fprintf(stderr, "something unexpected went wrong - bailing out!\n");  \
+    exit(2);                                                              \
+  } while(0)
 
 static void usage(const char *msg)
 {
@@ -294,7 +294,7 @@ int main(int argc, char *argv[])
      curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_cb)
      != CURLE_OK ||
      curl_easy_setopt(curl, CURLOPT_RESOLVE, resolve) != CURLE_OK)
-    err();
+    ERR();
 
   curl_easy_setopt(curl, CURLOPT_URL, url);
   curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, http_version);
index e0e7dfb36df7fda211f5d5dae94d52f1e2187457..ec34ed378130373a308eff7c17f95b5b9e33df0e 100644 (file)
@@ -37,7 +37,7 @@
 
 #include "memdebug.h"
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat"
 #pragma GCC diagnostic ignored "-Wformat-extra-args"
@@ -1601,6 +1601,6 @@ CURLcode test(char *URL)
     return CURLE_OK;
 }
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
index 8b50d553787f0f85f2f8441f37a5bfab63c1a1ba..fad154da0b96ea12187da35d3a2d63f4ee2992ff 100644 (file)
 
 #include "curl_printf.h"
 
+/* GCC <4.6 does not support '#pragma GCC diagnostic push' and
+   does not support 'pragma GCC diagnostic' inside functions. */
+#if (defined(__GNUC__) && \
+  ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6))))
+#define CURL_GNUC_DIAG
+#endif
+
 #ifdef _WIN32
 #define sleep(sec) Sleep((sec)*1000)
 #endif
index 3e70309b4bbf7d5b93973d16f7de6092fd32e0a3..52c571d899ea8c246faff78d8d52be49191057d6 100644 (file)
@@ -23,7 +23,7 @@
  ***************************************************************************/
 #include "curlcheck.h"
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat"
 #endif
@@ -186,6 +186,6 @@ fail_unless(rc == 128, "return code should be 128");
 
 UNITTEST_STOP
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
index 8607ecc7e270c2eff78e37e1d78170d4916d1db0..73d6436f143688eb85d9a40e1532990a704b0fca 100644 (file)
@@ -92,7 +92,7 @@ static int verify(const char *info, const char *two)
 
 UNITTEST_START
 
-#if defined(__GNUC__) && !defined(__clang__)
+#if defined(CURL_GNUC_DIAG) && !defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat"
 #pragma GCC diagnostic ignored "-Wformat-zero-length"
@@ -146,7 +146,7 @@ Curl_infof(testdata, "%s", input);
 fail_unless(strlen(output) == 2051, "Truncation of infof input 3");
 fail_unless(output[sizeof(output) - 1] == '\0', "Truncation of infof input 3");
 
-#if defined(__GNUC__) && !defined(__clang__)
+#if defined(CURL_GNUC_DIAG) && !defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
 
index fc7017e4a89a3713bc46b0047a92ac11105d8506..e2357068f03e637a6171b88af115680d0c9b7151 100644 (file)
@@ -46,7 +46,7 @@ struct set {
 UNITTEST_START
 #ifdef USE_SSH
 {
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Woverlength-strings"
 #endif
@@ -78,7 +78,7 @@ UNITTEST_START
     { NULL, NULL, NULL, NULL, CURLE_OK }
   };
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic warning "-Woverlength-strings"
 #endif
 
@@ -114,7 +114,7 @@ UNITTEST_START
 
   free((void *)list[0].cp);
 }
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
 
index 03d37a555ca4b48f24f149b22673b2da29adc3d2..c6af86061d3660a9a9a503a325bc348311280296 100644 (file)
@@ -49,7 +49,7 @@ static CURLcode unit_stop(void)
   return CURLE_OK;
 }
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Woverlength-strings"
 #endif
@@ -80,7 +80,7 @@ static const char *filecontents[] = {
   "LINE1\x1aTEST"
 };
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic warning "-Woverlength-strings"
 #endif
 
@@ -175,7 +175,7 @@ UNITTEST_START
   return (CURLcode)rc;
 UNITTEST_STOP
 
-#if defined(__GNUC__) || defined(__clang__)
+#if defined(CURL_GNUC_DIAG) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif