[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