[PATCH] gcc 4.2.1 doesn't support #pragma GCC diagnostic ignored

Jon TURNEY jon.turney at dronecode.org.uk
Wed Mar 26 09:14:22 PDT 2014


On 09/02/2014 10:20, Matthieu Herrb wrote:
>  os/log.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git os/log.c os/log.c
> index 8deb810..38193ee 100644
> --- os/log.c
> +++ os/log.c
> @@ -195,7 +195,9 @@ LogInit(const char *fname, const char *backup)
>      char *logFileName = NULL;
>  
>      if (fname && *fname) {
> +#if __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 2
>  #pragma GCC diagnostic ignored "-Wformat-nonliteral"
> +#endif
>          if (asprintf(&logFileName, fname, display) == -1)
>              FatalError("Cannot allocate space for the log file name\n");
>  
> @@ -206,7 +208,9 @@ LogInit(const char *fname, const char *backup)
>                  char *suffix;
>                  char *oldLog;
>  
> +#if __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 2
>  #pragma GCC diagnostic ignored "-Wformat-nonliteral"
> +#endif
>                  if ((asprintf(&suffix, backup, display) == -1) ||
>                      (asprintf(&oldLog, "%s%s", logFileName, suffix) == -1))
>                      FatalError("Cannot allocate space for the log file name\n");

This construction (which is now used in a few places), fails for me with gcc
4.4.3, giving "error: #pragma GCC diagnostic not allowed inside functions".

Either the gcc version check needs to be adjusted, or the pragma moved outside
the function (as has happened in some other places).

Attached is a patch to do the latter.

In this specific case in LogInit(), I'm not sure that ignoring the non-literal
format warning is a good idea, as the format string may be an unsantized
string given using the -logfile option.

-------------- next part --------------
>From a323b85cf0d00ce6356264053e22dffac6af50d7 Mon Sep 17 00:00:00 2001
From: Jon TURNEY <jon.turney at dronecode.org.uk>
Date: Wed, 26 Mar 2014 15:19:20 +0000
Subject: [PATCH] Move 'pragma GCC diagnostic' outside functions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

$ gcc --version
gcc (Gentoo 4.4.3-r2 p1.2) 4.4.3

/jhbuild/checkout/xorg/xserver/os/log.c: In function â??LogInitâ??:
/jhbuild/checkout/xorg/xserver/os/log.c:199: error: #pragma GCC diagnostic not allowed inside functions
/jhbuild/checkout/xorg/xserver/os/log.c:201: warning: format not a string literal, argument types not checked
/jhbuild/checkout/xorg/xserver/os/log.c:212: error: #pragma GCC diagnostic not allowed inside functions
/jhbuild/checkout/xorg/xserver/os/log.c:214: warning: format not a string literal, argument types not checked

etc.

Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
---
 hw/xfree86/os-support/linux/lnx_init.c |  6 +++++-
 os/log.c                               | 10 ++++------
 test/signal-logging.c                  |  7 ++++---
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
index 85709c6..9485307 100644
--- a/hw/xfree86/os-support/linux/lnx_init.c
+++ b/hw/xfree86/os-support/linux/lnx_init.c
@@ -76,6 +76,9 @@ switch_to(int vt, const char *from)
         FatalError("%s: VT_WAITACTIVE failed: %s\n", from, strerror(errno));
 }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
 void
 xf86OpenConsole(void)
 {
@@ -166,7 +169,6 @@ xf86OpenConsole(void)
 
         i = 0;
         while (vcs[i] != NULL) {
-#pragma GCC diagnostic ignored "-Wformat-nonliteral"
             snprintf(vtname, sizeof(vtname), vcs[i], xf86Info.vtno);    /* /dev/tty1-64 */
             if ((xf86Info.consoleFd = open(vtname, O_RDWR | O_NDELAY, 0)) >= 0)
                 break;
@@ -272,6 +274,8 @@ xf86OpenConsole(void)
     }
 }
 
+#pragma GCC diagnostic pop
+
 void
 xf86CloseConsole(void)
 {
diff --git a/os/log.c b/os/log.c
index 38193ee..491e518 100644
--- a/os/log.c
+++ b/os/log.c
@@ -189,15 +189,15 @@ strlen_sigsafe(const char *s)
  * string.
  */
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
 const char *
 LogInit(const char *fname, const char *backup)
 {
     char *logFileName = NULL;
 
     if (fname && *fname) {
-#if __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 2
-#pragma GCC diagnostic ignored "-Wformat-nonliteral"
-#endif
         if (asprintf(&logFileName, fname, display) == -1)
             FatalError("Cannot allocate space for the log file name\n");
 
@@ -208,9 +208,6 @@ LogInit(const char *fname, const char *backup)
                 char *suffix;
                 char *oldLog;
 
-#if __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 2
-#pragma GCC diagnostic ignored "-Wformat-nonliteral"
-#endif
                 if ((asprintf(&suffix, backup, display) == -1) ||
                     (asprintf(&oldLog, "%s%s", logFileName, suffix) == -1))
                     FatalError("Cannot allocate space for the log file name\n");
@@ -254,6 +251,7 @@ LogInit(const char *fname, const char *backup)
 
     return logFileName;
 }
+#pragma GCC diagnostic pop
 
 void
 LogClose(enum ExitCode error)
diff --git a/test/signal-logging.c b/test/signal-logging.c
index 88b37c1..85d4ff4 100644
--- a/test/signal-logging.c
+++ b/test/signal-logging.c
@@ -113,12 +113,13 @@ double float_tests[] = { 0, 5, 0.1, 0.01, 5.2342, 10.2301,
                          -1, -2.00, -0.6023, -1203.30
                         };
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Woverflow"
+
 static void
 number_formatting(void)
 {
     int i;
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Woverflow"
     long unsigned int unsigned_tests[] = { 0,/* Zero */
                                            5, /* Single digit number */
                                            12, /* Two digit decimal number */
@@ -141,7 +142,6 @@ number_formatting(void)
                                 -0x15D027BF211B37A, /* Large > 32 bit number */
                                 -0x7FFFFFFFFFFFFFFF, /* Maximum 64-bit signed number */
     } ;
-#pragma GCC diagnostic pop
 
     for (i = 0; i < sizeof(unsigned_tests) / sizeof(unsigned_tests[0]); i++)
         assert(check_number_format_test(unsigned_tests[i]));
@@ -152,6 +152,7 @@ number_formatting(void)
     for (i = 0; i < sizeof(float_tests) / sizeof(float_tests[0]); i++)
         assert(check_float_format_test(float_tests[i]));
 }
+#pragma GCC diagnostic pop
 
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat-security"
-- 
1.8.3.4



More information about the xorg-devel mailing list