division: NaN - producing operation with "gcc -W -O3"

Ian McConnell ian@nasoftwr.demon.co.uk
Mon Dec 13 06:22:00 GMT 1999


When I compile the following program with gcc-2.95.1 on linux (pentium), I
get

/usr/local/gcc-2.95.1/bin/gcc -W -O3 -Wall bug.c
bug.c: In function `main':
bug.c:49: warning: division: NaN - producing operation

but line 49 is the last line of the file! Adding whitespace to the end of
the file moves the error down another line.

Lower optimization levels and without -W do not produce the misleading
warning. Also changing the initialization (the #if lines) removes the error.

If it really must give an error, then change it to
bug.c:20: warning: division: possible NaN - producing operation




Other versions give me

gcc version egcs-2.91.60 Debian 2.1 (egcs-1.1.1 release)
> egcc -W -O3 /ian/bug.c
/ian/bug.c: In function `main':
/ian/bug.c:49: warning:  ediv invalid operation error




> gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.2.3/specs
gcc version 2.7.2.3
> gcc -W -O3 /ian/bug.c
/ian/bug.c: In function `main':
/ian/bug.c:47: warning:  ediv invalid operation error



and on
SunOS skoda 5.5 Generic_103093-27 sun4m sparc SUNW,SPARCstation-20

> /usr/local/gcc-2.95.1/bin/gcc -W -O3 bug.c 
bug.c: In function `main':
bug.c:47: warning: division: NaN - producing operation



Here is the source


/* Compile with gcc -W -O3 bug.c */
static double welford_mean;
static double welford_variance;
static int welford_nsum;

static void welford_new(double x)
{
  double diff;
  int ntot;

  ntot = welford_nsum + 1;
  welford_nsum = ntot;

  if (ntot == 1) {
    welford_mean = x;
    welford_variance = 0;
  } else {
    diff = x - welford_mean;
    welford_mean += diff / ntot;
    welford_variance = (welford_variance*(ntot-2))/(ntot-1) + diff*diff/ntot;
  }
}


static void init_welford(void)
{
#if 0
  /* Everything is ok */
  welford_nsum = 0;
#else
  /*
    This produces the error 
    bug.c: In function `main':
    bug.c:49: warning: division: NaN - producing operation
  */
  welford_variance = welford_mean = welford_nsum = 0;
#endif
}


int main(void)
{
  init_welford();
  welford_new(10.0);

  return 0;
}
/* Line 49 is after this one! */












/usr/local/gcc-2.95.1/bin/gcc -v --save-temps -W -O3 -Wall bug.c
Reading specs from /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95
.1/specs
gcc version 2.95.1 19990816 (release)
 /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/cpp -lang-c -v 
-D__GNUC__=2 -D__GNUC_MINOR__=95 -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -
D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__OPTIMIZE
__ -W -Wall -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di686 -Dpent
iumpro -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ bug.c bug.i
GNU CPP version 2.95.1 19990816 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/../../../../i68
6-pc-linux-gnulibc1/include
 /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/include
 /usr/include
End of search list.
The following default directories have been omitted from the search path:
 /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/../../../../inc
lude/g++-3
End of omitted list.
 /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/cc1 bug.i -quie
t -dumpbase bug.c -O3 -W -Wall -version -o bug.s
GNU C version 2.95.1 19990816 (release) (i686-pc-linux-gnulibc1) compiled by GNU
 C version 2.95.1 19990816 (release).
bug.c: In function `main':
bug.c:49: warning: division: NaN - producing operation
 as -V -Qy -o bug.o bug.s
GNU assembler version 2.9.1 (i386-pc-linux-gnulibc1), using BFD version 2.9.1.0.
19
 /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/collect2 -m elf
_i386 -dynamic-linker /lib/ld-linux.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lo
cal/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1/crtbegin.o -L/usr/local
/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1/2.95.1 -L/usr/local/gcc-2.95.1/li
b bug.o -lgcc -lc -lgcc /usr/local/gcc-2.95.1/lib/gcc-lib/i686-pc-linux-gnulibc1
/2.95.1/crtend.o /usr/lib/crtn.o



Here's the .i file, but is identical to the code since I don't use any
#includes. 

begin 644 bug.i.gz
M'XL("&C^5#@``V)U9RYI`'52T0Z",`Q\WU<T^L(D"OA*^!8S89@F,!(8:F+X
M=]LQ,$/E86R]WK6[;@\9[*[C[53N!(C!*HLE5-UX;30\=%-W?75IM3+Y'^RN
M>E2FU"N.QJZ@&<8V%PMR[[#Z0/H1>:FG%"\!BW"%=9W3D76,[2SQP6V@"'0A
MAHSS@ECQH6`-T4PK()/`%2"X$24_\R"ZW(60E)$)=#-H3^6^F`+'C2]?NG$Q
M)R>^F3\EHFWLX/H]GJ5,YAVU'3NI`R_)HC:)282FHD%[\7(11]A1_JBR__]H
M8&/&QDARP-7A.;0*S:H+83D9#(&FFJ6G5+H1]-J.O6&EB=[6&WBP(.IJ`@``
`
end


More information about the Gcc-bugs mailing list