Argh, je ne sais pas si ma distrib est dans les choux ou si c'est vraiment un bug de gcc. En tous les cas, ça me parait trop gros pour être un bug, je dois forcément avoir merdé quelque part. Est-ce que quelqu'un pourrait me dire s'il a le même problème que moi en compilant ce petit programme C, sur machine intel (j'ai un P4 Xeon), histoire de voir si je suis le seul pingouin^Wmanchot à avoir ce problème :
$ cat test.c
#include <stdio.h> /* Euh, attention aux balises :-\ */
int main( int nb, char *argv[] )
{
unsigned char a = nb, b = nb + 1;
printf("a = %d - b = %d\n", a, b);
a ^= b; b ^= a; a ^= b;
printf("a = %d - b = %d\n", a, b);
return 0;
}
$ gcc --version
gcc (GCC) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -O test.c -o test
/home/thierry/tmp/cciBJg3E.s: Assembler messages:
/home/thierry/tmp/cciBJg3E.s:25: Error: bad register name `%sil'
$ gcc -O2 test.c -o test
/home/thierry/tmp/ccjPxvyd.s: Assembler messages:
/home/thierry/tmp/ccjPxvyd.s:24: Error: bad register name `%sil'
$ gcc -O3 test.c -o test
$ ./test
a = 1 - b = 2
a = 2 - b = 1
$ gcc test.c -o test
$ ./test a b
a = 3 - b = 4
a = 4 - b = 3
$ Huh ???!!!
bash: !: event not found
Rien vu sur google ni dans le bugzilla de gcc.
# Chez moi ca compile du 1er coup
Posté par cho7 (site web personnel) . Évalué à 1.
cho7@cho7land:~$ gcc -O cho7.c -o cho7
cho7@cho7land:~$ gcc -O2 cho7.c -o cho7
cho7@cho7land:~$ gcc -O3 cho7.c -o cho7
cho7@cho7land:~$ ./cho7
a = 1 - b = 2
a = 2 - b = 1
cho7@cho7land:~$ ./cho7 a b
a = 3 - b = 4
a = 4 - b = 3
[^] # Re: Chez moi ca compile du 1er coup
Posté par cho7 (site web personnel) . Évalué à 2.
[^] # Re: Chez moi ca compile du 1er coup
Posté par tpierron . Évalué à 1.
$ as --version
GNU assembler 2.15.90.0.3 20040415
Copyright 2002 Free Software Foundation, Inc.
$ cat /proc/version
Linux version 2.6.8.1-12mdk (quintela@n5.mandrakesoft.com) (gcc version 3.4.1 (Mandrakelinux (Alpha 3.4.1-3mdk)) #1 Fri Oct 1 12:53:41 CEST 2004
[^] # Re: Chez moi ca compile du 1er coup
Posté par cho7 (site web personnel) . Évalué à 0.
# J'ai fait tout comme toi
Posté par EdB . Évalué à 2.
a = 1 - b = 2
a = 2 - b = 1
sans parametres
et
a = 3 - b = 4
a = 4 - b = 3
avec 2 parametres
cependant la ligne a ^= b; b ^= a; a ^= b; remplacée par a=b; b=a; a=b; donne le même résultat donc ?????
l'opérateur ^= servait a quoi (puissance ? Est tu sur qu'il soit valable.
Normalement a et b devrait être identique non ?
[^] # Re: J'ai fait tout comme toi
Posté par M . Évalué à 4.
Normalement a et b devrait être identique non ?
^ est un xor ....
[^] # Re: J'ai fait tout comme toi
Posté par tpierron . Évalué à 2.
[^] # Re: J'ai fait tout comme toi
Posté par Pascal Terjan (site web personnel) . Évalué à 4.
[^] # Re: J'ai fait tout comme toi
Posté par Pascal Terjan (site web personnel) . Évalué à 4.
[^] # Re: J'ai fait tout comme toi
Posté par tpierron . Évalué à 3.
Cela dit, on peut contourner ce problème en passant explicitement par une variable temporaire. Pour ceux à qui ça intéresse.
[^] # Re: J'ai fait tout comme toi
Posté par M . Évalué à 3.
Ca sent le gcc bugge...
[^] # Re: J'ai fait tout comme toi
Posté par Guillaume Knispel . Évalué à 3.
/tmp/ccJIXVPs.s: Messages de l'assembleur:
/tmp/ccJIXVPs.s:24: ERREUR: mauvais nom de registre « %sil »
Idem donc sur une FC3,
[xilun@box ~]$ gcc --version
gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
Copyright © 2004 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS
GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
Bref tres surrement bug violent de gcc qu'il faudrait faire remonter d'urgence.
# Corrigé
Posté par Guillaume Knispel . Évalué à 3.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19005(...)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.