From patchwork Tue Nov 25 22:23:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Eggert X-Patchwork-Id: 3914 Received: (qmail 24671 invoked by alias); 25 Nov 2014 22:23:48 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 24660 invoked by uid 89); 25 Nov 2014 22:23:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.4 required=5.0 tests=AWL, BAYES_00, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: smtp.cs.ucla.edu Message-ID: <5475016C.8070805@cs.ucla.edu> Date: Tue, 25 Nov 2014 14:23:40 -0800 From: Paul Eggert User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Roland McGrath CC: Joseph Myers , libc-alpha@sourceware.org Subject: Re: Add macros for diagnostic control, use them in locale/weightwc.h References: <546F79BB.80604@cs.ucla.edu> <546F8FA5.2050702@cs.ucla.edu> <54701BAA.1030805@cs.ucla.edu> <20141125000003.4A4E32C3AD5@topped-with-meat.com> In-Reply-To: <20141125000003.4A4E32C3AD5@topped-with-meat.com> On 11/24/2014 04:00 PM, Roland McGrath wrote: > The only thing I'd like you to do differently is to put more explanation in > the code itself Thanks, I installed the patch with that change. From 27f9b288f9af8ad7862c9852c4e002dbdf8207cc Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 25 Nov 2014 14:12:48 -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 | 13 +++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ee0650..c020ed4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2014-11-25 Paul Eggert + + 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-25 Joseph Myers * posix/bug-regex31.c (main): Return RES not 0. diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c index db6d9d7..1e27913 100644 --- a/posix/fnmatch_loop.c +++ b/posix/fnmatch_loop.c @@ -343,7 +343,12 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) #ifdef _LIBC else if (c == L('[') && *p == L('=')) { - UCHAR str[1]; + /* It's important that STR be a scalar variable rather + than a one-element array, because GCC (at least 4.9.2 + -O2 on x86-64) can be confused by the array and + diagnose a "used initialized" in a dead branch in the + findidx function. */ + UCHAR str; uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); const CHAR *startp = p; @@ -355,7 +360,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 +373,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 +388,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