Skip to content

Commit

Permalink
fnmatch: work around GCC compiler warning bug with uninit var
Browse files Browse the repository at this point in the history
* 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]".
  • Loading branch information
Paul Eggert committed Nov 25, 2014
1 parent bde2667 commit b1eda10
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
2014-11-25 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-25 Joseph Myers <joseph@codesourcery.com>

* posix/bug-regex31.c (main): Return RES not 0.
Expand Down
13 changes: 9 additions & 4 deletions posix/fnmatch_loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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(']'))
Expand All @@ -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
Expand All @@ -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 *)
Expand Down

0 comments on commit b1eda10

Please sign in to comment.