Forum Programmation.autre Bug gcc 3.4.1 et 3.3 ?

Posté par  .
Étiquettes : aucune
0
14
déc.
2004
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  (site web personnel) . Évalué à 1.

    Quelque soit le niveau d'optimisation
    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  (site web personnel) . Évalué à 2.

      ah et on me dit dans l'oreille que binutils est peut etre dans le coup. Verifie que l'assembleur est a jour par rapport a gcc
      • [^] # Re: Chez moi ca compile du 1er coup

        Posté par  . Évalué à 1.

        Quelle version de gcc as tu ? Et de l'assembleur as ? Quelle distrib ? Chez moi :
        $ 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
  • # J'ai fait tout comme toi

    Posté par  . Évalué à 2.

    Et aucun message d'erreur et tout les binaire produisent
    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  . Évalué à 4.

      l'opérateur ^= servait a quoi (puissance ? Est tu sur qu'il soit valable.
      Normalement a et b devrait être identique non ?

      ^ est un xor ....
    • [^] # Re: J'ai fait tout comme toi

      Posté par  . Évalué à 2.

      Bah, en fait cette construction est un moyen bourrin d'échanger le contenu de 2 variables en C sans passer par une variable intermédiaire. gcc semble reconnaitre ce genre de construction et optimise en utilisant une instruction spéciale "xchgb", mais avec des registres foireux. Pas cool, ça sent la réinstallation.
      • [^] # Re: J'ai fait tout comme toi

        Posté par  (site web personnel) . Évalué à 4.

        [pterjan@cmoi tmp]$ gcc -O0 plop.c
        [pterjan@cmoi tmp]$ gcc -O1 plop.c
        /home/pterjan/tmp/ccdtC0TG.s: Assembler messages:
        /home/pterjan/tmp/ccdtC0TG.s:25: Error: bad register name `%sil'
        [pterjan@cmoi tmp]$ gcc -O2 plop.c
        /home/pterjan/tmp/cccnGMUj.s: Assembler messages:
        /home/pterjan/tmp/cccnGMUj.s:24: Error: bad register name `%sil'
        [pterjan@cmoi tmp]$ gcc -O3 plop.c
        [pterjan@cmoi tmp]$ gcc --version
        gcc (GCC) 3.4.3 (Mandrakelinux 10.2 3.4.3-1mdk)
        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.
        
        Même problème ici et je ne pense pas que la reinstallation t'aide
        • [^] # Re: J'ai fait tout comme toi

          Posté par  (site web personnel) . Évalué à 4.

          J'ai signalé sur http://qa.mandrakesoft.com/show_bug.cgi?id=12681(...) mais a première vue c'est pas lié à la distrib.
          • [^] # Re: J'ai fait tout comme toi

            Posté par  . Évalué à 3.

            Ah, je ne suis pas le seul à voir ce problème. Je commençais à avoir des doutes. En fait je m'étais aperçu de ce problème avec la Mandrake 10.0 Community, mais bon comme c'était une community, je n'avais pas trop cherché à comprendre. Je suis passé en 10.1 official récemment, et paf : même problème.

            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  . Évalué à 3.

        ca le fait aussi avec gcc-3.4 de debian sid...

        Ca sent le gcc bugge...
        • [^] # Re: J'ai fait tout comme toi

          Posté par  . Évalué à 3.

          [xilun@box ~]$ gcc -O2 test.c -o test
          /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  . Évalué à 3.

    Pour ceux que ca interesse le bug vient d'être corrigé.

    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.