La fonction qui tue gcc

La fonction qui tue gcc - C - Programmation

Marsh Posté le 30-09-2009 à 09:54:39    

Code :
  1. #include <string.h>
  2.   void test( char *in, char *out)
  3.   {
  4.       char tmp[8];
  5.       strcpy(tmp,"aaaaaaaaaaa" );
  6.       strcpy(out, in);
  7.       strcpy(out, in);
  8.   }


 
 
si je compile ça en optimisé avec gcc 4.1.2 on a ce beau message d'erreur de compilation :
 

$ gcc -c test.c -O
test.c: In function 'test':
test.c:15: erreur: Tentative pour détruire le prologue/épilogue insn:
(insn/f 39 38 40 0 (set (mem:SI (plus:SI (reg/f:SI 6 bp)
                (const_int -8 [0xfffffff8])) [0 S4 A8])
        (reg:SI 3 bx)) -1 (nil)
    (nil))
test.c:15: erreur interne du compilateur: dans propagate_one_insn, à flow.c:1699
Veuillez soumettre un rapport complet d'anomalies,
avec le source pré-traité si nécessaire.
Consultez <URL:http://bugzilla.redhat.com/bugzilla> pour plus de détail.
Preprocessed source stored into /tmp/ccwonGK1.out file, please attach this to your bugreport.


 
Mon explication de noob :

Spoiler :

Mon explication de noob : le compilateur alloue 8 octets dans la pile pour tmp et optimise strcpy en remplaçant l'appel à la fonction par la chaîne "aaaaaaaaaaa" qui vous l'aurez évidemment remarqué fait plus de 8 caractères, et le compilateur écrit cette chaîne de caractère en assembleur sur les instructions suivantes.


 
Mais concrètement, que se passe-t-il?
 
 
$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)
 
avec gcc 3.4 ça ne plante pas


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 30-09-2009 à 09:54:39   

Reply

Marsh Posté le 30-09-2009 à 10:28:23    

GCC 4.3.2 n'a aucun souci avec ca


---------------
last.fm
Reply

Marsh Posté le 30-09-2009 à 12:01:10    

ICE = bug de GCC
 
Ton code C est légal mais donne un comportement indéfini (UB).

Reply

Marsh Posté le 30-09-2009 à 12:15:04    

Pas de détails plus croustillants sur ce qui provoque ce bug?


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 30-09-2009 à 14:38:50    

A moins d'ouvrir le bug chez Gcc, non.
 
C'est peut-être une régression RH, parce que j'ai pas le problème en: gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)

Reply

Marsh Posté le 30-09-2009 à 15:02:03    

OK. Bein merci.


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 30-09-2009 à 18:03:42    

ca servirait vraiment d'ouvrir un bug pour quelque chose qui a, semble-t-il, déjà été corrigé ?

Code :
  1. $ gcc-4 --version
  2. gcc-4 (GCC) 4.3.2 20080827 (beta) 2


 
Edit : Je ne suis pas familier avec les numéros de version de gcc, mais vous auriez un intérêt particulier à rester en 4.1 ? Ou c'est juste ma version qui est folklorique ?


Message édité par theshockwave le 30-09-2009 à 18:05:28

---------------
last.fm
Reply

Marsh Posté le 30-09-2009 à 18:27:39    

Je ne suis pas familier avec l'ouverture de bugs chez gcc, et puis bon la 4.1 ça correspond à la plateforme cible où doit être compilée l'application.


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 30-09-2009 à 20:57:27    

Tu ferais mieux de regarder chez RedHat si t'as pas une version patchée qui fonctionne chez eux. Ou chercher leur base de bugs.

Reply

Marsh Posté le 30-09-2009 à 23:05:55    

J'ai découvert ce bug dans une application qui génère du code. Il alloue un tableau de taille fixe pour stocker un nom, et ça a foutu le bordel avec un nom trop long. Du coup je vais corriger le générateur de code, j'ai pas l'intention de chercher un patch pour gcc bien que j'ai signalé le problème. Je posais la question ici par curiosité.


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 30-09-2009 à 23:05:55   

Reply

Marsh Posté le 30-09-2009 à 23:44:47    

Pas de problème avec ce code compilé par gcc-4.3.2 sur ma Debian Lenny...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed