La fonction qui tue gcc - C - Programmation
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).
Marsh Posté le 30-09-2009 à 12:15:04
Pas de détails plus croustillants sur ce qui provoque ce bug?
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)
Marsh Posté le 30-09-2009 à 15:02:03
OK. Bein merci.
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 :
|
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 ?
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.
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.
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é.
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...
Marsh Posté le 30-09-2009 à 09:54:39
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 :
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. »