This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Add macros for diagnostic control, use them in locale/weightwc.h


Joseph Myers wrote:
it's warning about str[1] for an array
wint_t str[1] for which only str[0] is valid and only str[0] exists to be
initialized (but the - unreachable - code is, after propagating some
constants, accessing str[1]).

Yeouch, GCC is even more confused than I thought.

Instead of masking the GCC bug, how about changing the libc source slightly so that the bug isn't tickled? The attached patch does that, and this fixes the bug for me (x86-64, both GCC 4.9.2 and GCC 4.8.3) without having to fiddle with any pragmas. As a bonus this patch seems to make the resulting machine code slightly more efficient; it's smaller, anyway.

We did this sort of thing with gnulib etc. too. If memory serves, occasionally the buggy warnings were signs of other trouble within GCC, so it wasn't unreasonable to change the code to pacify the compiler. I do try to file GCC bug reports for this sort of thing but I'm not perfect in that regard.
>From 7c16bdc58c74e3515d8d71e5e006005566e5a32a Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Fri, 21 Nov 2014 20:57:58 -0800
Subject: [PATCH] fnmatch: work around GCC compiler warning bug with uninit var

* posix/fnmatch_loop.c (FCT): Use a scalar not a one-item array.
This works around a bug with x86-64 GCC 4.9.2 and earlier
where 'gcc -O2 -Wmaybe-uninitialized' incorrectly complains
"../locale/weightwc.h:93:7: warning: '*((void *)&str+4)' may be
used uninitialized in this function [-Wmaybe-uninitialized]".
---
 ChangeLog            | 9 +++++++++
 posix/fnmatch_loop.c | 8 ++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c75dab7..3c7b9e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-11-21  Paul Eggert  <eggert@cs.ucla.edu>
+
+	fnmatch: work around GCC compiler warning bug with uninit var
+	* posix/fnmatch_loop.c (FCT): Use a scalar not a one-item array.
+	This works around a bug with x86-64 GCC 4.9.2 and earlier
+	where 'gcc -O2 -Wmaybe-uninitialized' incorrectly complains
+	"../locale/weightwc.h:93:7: warning: '*((void *)&str+4)' may be
+	used uninitialized in this function [-Wmaybe-uninitialized]".
+
 2014-11-21  Roland McGrath  <roland@hack.frob.com>
 
 	* nptl/pthread_create.c (__pthread_create_2_1): Set
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c
index db6d9d7..c1d8b69 100644
--- a/posix/fnmatch_loop.c
+++ b/posix/fnmatch_loop.c
@@ -343,7 +343,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
 #ifdef _LIBC
 		else if (c == L('[') && *p == L('='))
 		  {
-		    UCHAR str[1];
+		    UCHAR str;
 		    uint32_t nrules =
 		      _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
 		    const CHAR *startp = p;
@@ -355,7 +355,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
 			c = L('[');
 			goto normal_bracket;
 		      }
-		    str[0] = c;
+		    str = c;
 
 		    c = *++p;
 		    if (c != L('=') || p[1] != L(']'))
@@ -368,7 +368,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
 
 		    if (nrules == 0)
 		      {
-			if ((UCHAR) *n == str[0])
+			if ((UCHAR) *n == str)
 			  goto matched;
 		      }
 		    else
@@ -383,7 +383,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
 # endif
 			const int32_t *indirect;
 			int32_t idx;
-			const UCHAR *cp = (const UCHAR *) str;
+			const UCHAR *cp = (const UCHAR *) &str;
 
 # if WIDE_CHAR_VERSION
 			table = (const int32_t *)
-- 
1.9.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]