Newsgroup: it.comp.os.linux.development
Titolo: bug in egcc?

Credo di aver trovato un bug nell'egcs...
Prendiamo questo sorgente (l'ho ridotto all'osso eliminando tutto
cio' che non era necessario, se tolgo altro scompare anche il bug)
== CUT ====================================================================
#include <stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
/*---------------------------------------------------------------------*/
void rgb_to_hsv(unsigned char *i)
{
unsigned char o[3];
double r, g, b, v, max;
		r = (double)(i[0]) / 255;
		g = (double)(i[1]) / 255;
		b = (double)(i[2]) / 255;
		max = MAX(r, MAX(g, b));
		v = max;
		printf("MAX: %f  R: %f  G: %f  B: %f\n", max, r, g, b);
		if(r == max)
			printf("il massimo e' r\n");
		else if(g == max)
			printf("il massimo e' g\n");
		else
			printf("il massimo e' b\n");
		o[0] = (unsigned char)(v * 255);
}
/*---------------------------------------------------------------------*/
int main(void)
{
unsigned char i[3] = {161, 238, 214};
	rgb_to_hsv(i);
	return 0;
}
== CUT =====================================================================
Se compilato senza ottimizzazioni funziona regolarmente
$ egcc prova.c
$ a.out 
MAX: 0.933333  R: 0.631373  G: 0.933333  B: 0.839216
il massimo e' g
Se compilato con -O2 invece da' un risultato sbagliato
$ egcc -O2 prova.c
$ a.out 
MAX: 0.933333  R: 0.631373  G: 0.933333  B: 0.839216
il massimo e' b
In questo modo pero' funziona
$ egcc -O2 -fno-cse-skip-blocks -fno-cse-follow-jumps prova.c   
$ a.out 
MAX: 0.933333  R: 0.631373  G: 0.933333  B: 0.839216
il massimo e' g
La versione di egcc che utilizzo e'
$ egcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/egcs-2.90.29/specs
gcc version egcs-2.90.29 980515 (egcs-1.0.3 release)
Qualcuno puo' provare a compilarlo con un egcc piu' recente, per
vedere se il bug e' stato corretto? Eventualmente a chi bisognerebbe
segnalarlo?
-- 
ciao,
Claudio

$ egcc bug.c -o bug -O4 -s
$ ./bug
MAX: 0.933333  R: 0.631373  G: 0.933333  B: 0.839216
il massimo e' g
$ egcc -v
Reading specs from /usr/lib/...egcs-2.91.57/specs
gcc version egcs-2.91.57 19980901 (egcs-1.1 release)
--
____ __         __,_      __  _____
\  _\_ \  ___ _/ / /\  /\/  \/ / _/ It is better to reign in Hell
 \  _ \ \/ _ '/ , |\ VV / / / / _/ Than serve in Heaven.- MILTON
  \_,_/\_\_,_/_/|_| \__/\__/_/_/
      -- the one and only --     e-mail : 
blak...@tiscalinet.it
                                ICQ    : 59394345
The UNIX Guru's View of Sex:
$unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep

Ciao Claudio Piciarelli,
 > Qualcuno puo' provare a compilarlo con un egcc piu' recente, per
$ egcc bugs.c
$ ./a.out
MAX: 0.933333  R: 0.631373  G: 0.933333  B: 0.839216
il massimo e' g
$ egcc -O2 bugs.c
$ ./a.out
MAX: 0.933333  R: 0.631373  G: 0.933333  B: 0.839216
il massimo e' b
bello! :-)
hai provato step by step a debuggarlo?
quanto ho tempo lo faccio...
$ egcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.2/specs
gcc version 2.95.2 19991109 (Debian GNU/Linux)
-- 
Pa.Ped, Como
http://www.fastflow.it/~paolop

]

		if(r == max)
Non bisogna confrontare direttamente numeri in virgola mobile.
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

Pape' Satan, pape' Satan aleppe, comincio' BlakWolf con voce chioccia:
B> $ egcc bug.c -o bug -O4 -s
                       ^^^
dimenticavo di dire che il bug si manifesta SOLO se compilo con -O2,
con -O, -O3, -O4 ecc. scompare.
-- 
ciao,
Claudio