Using -Wall and -Woverloaded-virtual together changes the behaviour of the code

Vadim Zeitlin vz-gcc@zeitlins.org
Tue Mar 27 11:22:00 GMT 2018


On Fri, 23 Mar 2018 22:34:03 +0300 (MSK) Alexander Monakov <amonakov@ispras.ru> wrote:

AM> On Fri, 23 Mar 2018, Vadim Zeitlin wrote:
AM> >  Yet they definitely do. I may not have a SSCCE of it, but building 4
AM> > versions of the same object file/executable that differ only in the warning
AM> > options used:
AM> > 
AM> > 1. Both -Wall and -Woverloaded-virtual
AM> > 2. Only -Wall
AM> > 3. Only -Woverloaded-virtual
AM> > 4. Neither
AM> 
AM> Since -Wall enables many individual warning options (you can see the list
AM> by supplying -Wall -Q --help=warnings on gcc command line), to investigate
AM> further you can try to find a minimal subset of -Wall that still exhibits
AM> the issue.

 Thanks for the idea and the hint (I didn't know about the -Q option)! I
did this and it turns out the culprit is "-Wnonnull": using it with
"-Woverloaded-virtual" changes the generated code, while using all the
other options included in -Wall doesn't.

 Looking at gcc sources, this seems completely impossible as
OPT_Woverloaded_virtual is only used once in gcc/cp/class.c and this
clearly can't affect anything else. Yet somehow it does...


AM> >  Would you have any idea about how could this be explained?
AM> 
AM> By all indications this is an unusual compiler bug. Please file a report
AM> in GCC Bugzilla if you can, even if the testcase has a large line count.

 I made another attempt to use delta and it managed to produce a "just" 771
line file reproducing the problem, but I discovered another impossible
thing while doing this: not only the generated code depends on the warnings
options, but it also somehow depends on the name of the input file! Delta
finished by producing a file tmp1/16795.cpp, yet when I tested it manually,
the file didn't pass the check, i.e. compiling it with and without warning
options produced the same object file. It looked like a bug in delta
itself, so I've started debugging it and while doing it noticed that it
always runs the test script with input.cpp as argument, and not the final
file name. And, surprise, renaming the *same* file to input.cpp indeed
makes the code generated from it when [not] using warning options
different...

 This really looks like a bad bug due to using uninitialized memory
somewhere in gcc itself. The only question is whether it's a problem of the
particular gcc build I'm using or not.

 Anyhow, I've created https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85091
now, please let me know if I can do anything else here.

 Thanks,
VZ
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-help/attachments/20180327/b1c3cb6e/attachment-0001.sig>


More information about the Gcc-help mailing list