[Bug c/71699] New: bogus -Wmaybe-uninitialized warning: gcc misses that non-NULL pointer + offset can never be NULL
palves at redhat dot com
gcc-bugzilla@gcc.gnu.org
Wed Jun 29 15:07:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71699
Bug ID: 71699
Summary: bogus -Wmaybe-uninitialized warning: gcc misses that
non-NULL pointer + offset can never be NULL
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: palves at redhat dot com
Target Milestone: ---
gcc does not understand that adding an offset to a pointer returned by a
returns_nonnull function can never yield a NULL pointer. Vis:
$ cat test.c
char *xstrdup (const char *) __attribute__ ((__returns_nonnull__));
#define PREFIX "some "
int
main ()
{
char *saveptr;
char *name = xstrdup (PREFIX "name");
// name = PREFIX "name"; // this makes the warning go away
char *tail = name + sizeof (PREFIX) - 1;
// tail = &name[sizeof (PREFIX) - 1]; // this does not help
// tail = name; // while this makes the warning go away
if (tail == 0)
tail = saveptr;
while (*tail == ' ')
++tail;
return 0;
}
$ /opt/gcc/bin/gcc test.c -c -Wall
test.c: In function ‘main’:
test.c:18:10: warning: ‘saveptr’ may be used uninitialized in this function
[-Wmaybe-uninitialized]
tail = saveptr;
~~~~~^~~~~~~~~
Enabling optimization does not make it go away:
$ /opt/gcc/bin/gcc -O2 test.c -c -Wall
test.c: In function ‘main’:
test.c:19:10: warning: ‘saveptr’ may be used uninitialized in this function
[-Wmaybe-uninitialized]
while (*tail == ' ')
^~~~~
That was gcc version 7.0.0 20160503 (experimental) built from sources.
Fedora 23's gcc 5.3.1 shows the same.
This is a reduced testcase based on a warning gcc issued when building gdb:
https://sourceware.org/ml/gdb-patches/2016-06/msg00515.html
More information about the Gcc-bugs
mailing list