This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Gcc silently transforms a finite loop to an infinite one
- From: Ian Lance Taylor <iant at google dot com>
- To: Nadezhda IvanÐvna Vyukova <niva at niisi dot msk dot ru>
- Cc: gcc at gnu dot org
- Date: Tue, 29 Nov 2011 06:25:19 -0800
- Subject: Re: Gcc silently transforms a finite loop to an infinite one
- References: <1322566691.2994.43.camel@ab02>
Nadezhda IvanÐvna Vyukova <niva@niisi.msk.ru> writes:
> I am involved in support of customers who use GCC.
> Recently a customer has complaint that gcc-4.1.2
> generates an infinite loop for the following program:
>
> #include <stdio.h>
> extern void f (int);
> int main ()
> {
> char e = 0;
> do
> {
> printf ("--- e = %i\n", e);
> }
> while (++e);
> }
>
> When compiled with -O2 or higher the program prints
> 0, 1, ..., 128, ... 1000, ... etc.
> (Similar behavior is exposed by gcc-4.6.2).
>
> I've explained the customer that by default char is treated
> as signed char on our platform and therefore this program
> does not conform ISO C90, as it causes the integer overflow
> (undefined behavior). But he was not satisfied.
> He argued that the program compiled with gcc-3.4.6 behaves
> "correctly" and now the compiler silently produces an
> incomprehensible code.
Tell your customer to use the -fno-strict-overflow option.
> IMHO it would be better to issue a warning
> when a finite loop is transformed to an infinite one
> (as a result of -ftree-vrp).
Tell your customer to use the -Wstrict-overflow option.
This message might have been better directed to gcc-help@gcc.gnu.org.
I would have no objection to adding a default warning when a finite loop
is converted to an infinite loop. It's harder than it sounds, though.
It's not like gcc is looking a loop and deciding to make it infinite.
It's looking at a branch instruction and deciding that the condition can
never be true.
Ian