On 29/11/2011 15:25, Ian Lance Taylor wrote:
Nadezhda Ivanоvna Vyukova<n...@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-h...@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
A better method is perhaps to get users to enable warning flags by
default - but that's also harder than it sounds!
I've always thought that gcc should have two new warning flags that are
enabled by default - one being the "Warning - no warning flags given on
command line" flag, and the other being the "Warning - compiler crippled
by lack of -O flag" flag :-)