Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1837 connectés 

  FORUM HardWare.fr
  Programmation
  C

  La fonction qui tue gcc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

La fonction qui tue gcc

n°1927850
kaloskagat​os
Posté le 30-09-2009 à 09:54:39  profilanswer
 

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. »
mood
Publicité
Posté le 30-09-2009 à 09:54:39  profilanswer
 

n°1927861
theshockwa​ve
I work at a firm named Koslow
Posté le 30-09-2009 à 10:28:23  profilanswer
 

GCC 4.3.2 n'a aucun souci avec ca


---------------
last.fm
n°1927911
Taz
bisounours-codeur
Posté le 30-09-2009 à 12:01:10  profilanswer
 

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

n°1927914
kaloskagat​os
Posté le 30-09-2009 à 12:15:04  profilanswer
 

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. »
n°1927946
Taz
bisounours-codeur
Posté le 30-09-2009 à 14:38:50  profilanswer
 

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)

n°1927964
kaloskagat​os
Posté le 30-09-2009 à 15:02:03  profilanswer
 

OK. Bein merci.


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
n°1928034
theshockwa​ve
I work at a firm named Koslow
Posté le 30-09-2009 à 18:03:42  profilanswer
 

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
n°1928043
kaloskagat​os
Posté le 30-09-2009 à 18:27:39  profilanswer
 

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. »
n°1928061
Taz
bisounours-codeur
Posté le 30-09-2009 à 20:57:27  profilanswer
 

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.

n°1928090
kaloskagat​os
Posté le 30-09-2009 à 23:05:55  profilanswer
 

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. »
mood
Publicité
Posté le 30-09-2009 à 23:05:55  profilanswer
 

n°1928109
Sve@r
Posté le 30-09-2009 à 23:44:47  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  La fonction qui tue gcc

 

Sujets relatifs
fonction initialisé valeurs formulaires rien ne se passeExporter fonction excel
Fonction avec une checkboxfonction atoi, 00:00 en entrée
[JAVASRIPT] HELP ! Chargement page en fonction d'un test sur TEXTAREAProblème avec la fonction SCardTransmit
Opacité d'une image en fonction de l'avancement d'un preload Calcul de l'inverse d'une fonction de répartition
CATIA V5 - Automatiser la fonction searchPHP - fonction escapeshellcmd()
Plus de sujets relatifs à : La fonction qui tue gcc


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR