J'ai rajouté un printf() pour voir. Le programme origin el n'a aucun
de ces printf().
Pour l'instant, je me dirige vers la rédaction d'un rap port de bug
du compilo et de l'exemple minimal qui va bien... Le truc fonctionne
parfaitement bien avec Sun Studio et des vieux gcc.
J'ai rajouté un printf() pour voir. Le programme origin el n'a aucun
de ces printf().
Pour l'instant, je me dirige vers la rédaction d'un rap port de bug
du compilo et de l'exemple minimal qui va bien... Le truc fonctionne
parfaitement bien avec Sun Studio et des vieux gcc.
J'ai rajouté un printf() pour voir. Le programme origin el n'a aucun
de ces printf().
Pour l'instant, je me dirige vers la rédaction d'un rap port de bug
du compilo et de l'exemple minimal qui va bien... Le truc fonctionne
parfaitement bien avec Sun Studio et des vieux gcc.
On 17 oct, 22:30, JKB wrote:J'ai rajouté un printf() pour voir. Le programme originel n'a aucun
de ces printf().
Pour l'instant, je me dirige vers la rédaction d'un rapport de bug
du compilo et de l'exemple minimal qui va bien... Le truc fonctionne
parfaitement bien avec Sun Studio et des vieux gcc.
J'aimerais bien savoir dans quelles conditions tu testes exactement.
Ton code est incomplet.
J'ai reconstruit un environnement de test. :
#include <stdio.h>
#include <string.h>
typedef enum
{ d_faux, d_vrai }
bool_e;
typedef struct element_pile_systeme
{
char const type_cloture[6];
struct element_pile_systeme *suivant;
}
element_pile_systeme_s;
typedef struct
{
element_pile_systeme_s *l_base_pile_systeme;
}
etat_processus_s;
void test (etat_processus_s * s_etat_processus)
{
/*
* Test de la présence de l'instruction EXIT dans une boucle
*/
element_pile_systeme_s *l_element_pile_systeme > s_etat_processus->l_base_pile_systeme;
bool_e presence_boucle = d_faux;
bool_e drapeau_boucle_definie = d_faux;
while ((l_element_pile_systeme != NULL) &&
(printf (">%dn", presence_boucle), presence_boucle = > d_faux))
{
printf ("Boucle %dn", presence_boucle);
if ((strcmp (l_element_pile_systeme->type_cloture, "START") = > 0) ||
(strcmp (l_element_pile_systeme->type_cloture, "FOR") == 0))
{
printf ("Làn");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_vrai;
}
else if ((strcmp (l_element_pile_systeme->type_cloture, "DO") = > 0) ||
(strcmp (l_element_pile_systeme->type_cloture, "WHILE")
== 0))
{
printf ("Icin");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf ("<%s> %dn", l_element_pile_systeme->type_cloture,
presence_boucle);
l_element_pile_systeme = l_element_pile_systeme->suivant;
printf ("<> %dn", presence_boucle);
}
printf ("Pafn");
}
int main (void)
{
static element_pile_systeme_s a[] = {
{"START", a + 1},
{"STOP", NULL},
};
etat_processus_s etat_processus = { a };
test (&etat_processus);
return 0;
}
Peux-tu le compléter pour qu'on soit dans les même conditions que
toi ?
On 17 oct, 22:30, JKB <knatsc...@koenigsberg.fr> wrote:
J'ai rajouté un printf() pour voir. Le programme originel n'a aucun
de ces printf().
Pour l'instant, je me dirige vers la rédaction d'un rapport de bug
du compilo et de l'exemple minimal qui va bien... Le truc fonctionne
parfaitement bien avec Sun Studio et des vieux gcc.
J'aimerais bien savoir dans quelles conditions tu testes exactement.
Ton code est incomplet.
J'ai reconstruit un environnement de test. :
#include <stdio.h>
#include <string.h>
typedef enum
{ d_faux, d_vrai }
bool_e;
typedef struct element_pile_systeme
{
char const type_cloture[6];
struct element_pile_systeme *suivant;
}
element_pile_systeme_s;
typedef struct
{
element_pile_systeme_s *l_base_pile_systeme;
}
etat_processus_s;
void test (etat_processus_s * s_etat_processus)
{
/*
* Test de la présence de l'instruction EXIT dans une boucle
*/
element_pile_systeme_s *l_element_pile_systeme > s_etat_processus->l_base_pile_systeme;
bool_e presence_boucle = d_faux;
bool_e drapeau_boucle_definie = d_faux;
while ((l_element_pile_systeme != NULL) &&
(printf (">%dn", presence_boucle), presence_boucle = > d_faux))
{
printf ("Boucle %dn", presence_boucle);
if ((strcmp (l_element_pile_systeme->type_cloture, "START") = > 0) ||
(strcmp (l_element_pile_systeme->type_cloture, "FOR") == 0))
{
printf ("Làn");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_vrai;
}
else if ((strcmp (l_element_pile_systeme->type_cloture, "DO") = > 0) ||
(strcmp (l_element_pile_systeme->type_cloture, "WHILE")
== 0))
{
printf ("Icin");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf ("<%s> %dn", l_element_pile_systeme->type_cloture,
presence_boucle);
l_element_pile_systeme = l_element_pile_systeme->suivant;
printf ("<> %dn", presence_boucle);
}
printf ("Pafn");
}
int main (void)
{
static element_pile_systeme_s a[] = {
{"START", a + 1},
{"STOP", NULL},
};
etat_processus_s etat_processus = { a };
test (&etat_processus);
return 0;
}
Peux-tu le compléter pour qu'on soit dans les même conditions que
toi ?
On 17 oct, 22:30, JKB wrote:J'ai rajouté un printf() pour voir. Le programme originel n'a aucun
de ces printf().
Pour l'instant, je me dirige vers la rédaction d'un rapport de bug
du compilo et de l'exemple minimal qui va bien... Le truc fonctionne
parfaitement bien avec Sun Studio et des vieux gcc.
J'aimerais bien savoir dans quelles conditions tu testes exactement.
Ton code est incomplet.
J'ai reconstruit un environnement de test. :
#include <stdio.h>
#include <string.h>
typedef enum
{ d_faux, d_vrai }
bool_e;
typedef struct element_pile_systeme
{
char const type_cloture[6];
struct element_pile_systeme *suivant;
}
element_pile_systeme_s;
typedef struct
{
element_pile_systeme_s *l_base_pile_systeme;
}
etat_processus_s;
void test (etat_processus_s * s_etat_processus)
{
/*
* Test de la présence de l'instruction EXIT dans une boucle
*/
element_pile_systeme_s *l_element_pile_systeme > s_etat_processus->l_base_pile_systeme;
bool_e presence_boucle = d_faux;
bool_e drapeau_boucle_definie = d_faux;
while ((l_element_pile_systeme != NULL) &&
(printf (">%dn", presence_boucle), presence_boucle = > d_faux))
{
printf ("Boucle %dn", presence_boucle);
if ((strcmp (l_element_pile_systeme->type_cloture, "START") = > 0) ||
(strcmp (l_element_pile_systeme->type_cloture, "FOR") == 0))
{
printf ("Làn");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_vrai;
}
else if ((strcmp (l_element_pile_systeme->type_cloture, "DO") = > 0) ||
(strcmp (l_element_pile_systeme->type_cloture, "WHILE")
== 0))
{
printf ("Icin");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf ("<%s> %dn", l_element_pile_systeme->type_cloture,
presence_boucle);
l_element_pile_systeme = l_element_pile_systeme->suivant;
printf ("<> %dn", presence_boucle);
}
printf ("Pafn");
}
int main (void)
{
static element_pile_systeme_s a[] = {
{"START", a + 1},
{"STOP", NULL},
};
etat_processus_s etat_processus = { a };
test (&etat_processus);
return 0;
}
Peux-tu le compléter pour qu'on soit dans les même conditions que
toi ?
Le 17-10-2009, ? propos de
Re: Problème bizarre,
michko ?crivait dans fr.comp.lang.c :
> Sans doute un pb memoire, plutot que gdb, utilise
> un outil comme valgrind, ou bien donne un code
J'ai utilisé un valgrind qui n'a _rien_ trouvé. De to ute façon, je
ne vois pas comment avoir une corruption mémoire dans c e bout de
code, les seules variables touchées sont les deux drape aux. Le reste
n'est accédé qu'en lecture et il n'y a aucun thread p arallèle qui
pourrait modifier cette variable dans mon dos.
> complet. Par ailleurs, ton test sur printf me semble
> un peu superflu...
C'est simplement pour voir la valeur du drapeau _avant_ l e test.
Le souci, c'est que ça fonctionne parfaitement sous gdb en pas à pas.
Si je l'exécute sous gdb sans passer sur la fonction en question en pas à pas,
le truc plante de la même façon qu'en exécution normale :
(gdb) run -scp recherche_adresse.rpl
Starting program: /usr/local/bin/rpl -scp recherche_adresse.rpl
[Thread debugging using libthread_db enabled]
+++RPL/2 (R) version 4.0.7 (vendredi 16/10/2009, 22:11:12 CEST)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël>2<
Boucle 0
<IF> 0
<> 0
Boucle 0
Ici
<WHILE> 255
<> 255
Boucle 0
<> 0
<> 0
Boucle 0
<> 0
<> 0
Paf
+++Erreur : Instruction 'EXIT' hors d'une boucle [19895]
Program exited with code 01.
(gdb) break instruction_exit
(gdb) run -scp recherche_adresse.rpl
Starting program: /usr/local/bin/rpl -scp recherche_adresse.rpl
[Thread debugging using libthread_db enabled]
+++RPL/2 (R) version 4.0.7 (vendredi 16/10/2009, 22:11:12 CEST)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
1179 {
(gdb) cont
Continuing.
Breakpoin 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
1179 {
(gdb) cont
Continuing.
>2<
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
1179 {
(gdb) next
1195 (*s_etat_processus).erreur_execution = d_ex;
(gdb) next
1197 if ((*s_etat_processus).affichage_arguments == 'Y ')
(gdb) next
1240 else if ((*s_etat_processus).test_instruction == 'Y')
(gdb) next
1250 l_element_pile_systeme =
(*s_etat_processus).l_base_pile_systeme;
(gdb) next
1254 while((l_element_pile_systeme != NULL) && (presence _boucle
== d_faux))
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
(gdb) next
1256 printf("Boucle %dn", presence_boucle);
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
(gdb) next
1256 printf("Boucle %dn", presence_boucle);
(gdb) next
Boucle 0
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
1258 (strcmp((*l_element_pile_syst eme).type_cloture,
"FOR") == 0))
(gdb) next
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1272 printf("<%s> %dn", (*l_element_pile_systeme).type_cloture,
presence_boucle);
...
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
(gdb) next
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1267 printf("Icin");
(gdb) next
Ici
1272 printf("<%s> %dn", (*l_element_pile_systeme).type_cloture,
presence_boucle);
(gdb) next
<WHILE> 255
1274 printf("<> %dn", presence_boucle);
(gdb) next
<> 255
1284 if ((*s_etat_processus).mode_execution_programme = = 'Y')
(gdb)
Je suis sorti normalement de la boucle...
JKB
--
Le cerveau, c'est un véritable scandale écologique. Il représente 2 % de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Le 17-10-2009, ? propos de
Re: Problème bizarre,
michko ?crivait dans fr.comp.lang.c :
> Sans doute un pb memoire, plutot que gdb, utilise
> un outil comme valgrind, ou bien donne un code
J'ai utilisé un valgrind qui n'a _rien_ trouvé. De to ute façon, je
ne vois pas comment avoir une corruption mémoire dans c e bout de
code, les seules variables touchées sont les deux drape aux. Le reste
n'est accédé qu'en lecture et il n'y a aucun thread p arallèle qui
pourrait modifier cette variable dans mon dos.
> complet. Par ailleurs, ton test sur printf me semble
> un peu superflu...
C'est simplement pour voir la valeur du drapeau _avant_ l e test.
Le souci, c'est que ça fonctionne parfaitement sous gdb en pas à pas.
Si je l'exécute sous gdb sans passer sur la fonction en question en pas à pas,
le truc plante de la même façon qu'en exécution normale :
(gdb) run -scp recherche_adresse.rpl
Starting program: /usr/local/bin/rpl -scp recherche_adresse.rpl
[Thread debugging using libthread_db enabled]
+++RPL/2 (R) version 4.0.7 (vendredi 16/10/2009, 22:11:12 CEST)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël>2<
Boucle 0
<IF> 0
<> 0
Boucle 0
Ici
<WHILE> 255
<> 255
Boucle 0
<> 0
<> 0
Boucle 0
<> 0
<> 0
Paf
+++Erreur : Instruction 'EXIT' hors d'une boucle [19895]
Program exited with code 01.
(gdb) break instruction_exit
(gdb) run -scp recherche_adresse.rpl
Starting program: /usr/local/bin/rpl -scp recherche_adresse.rpl
[Thread debugging using libthread_db enabled]
+++RPL/2 (R) version 4.0.7 (vendredi 16/10/2009, 22:11:12 CEST)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
1179 {
(gdb) cont
Continuing.
Breakpoin 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
1179 {
(gdb) cont
Continuing.
>2<
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
1179 {
(gdb) next
1195 (*s_etat_processus).erreur_execution = d_ex;
(gdb) next
1197 if ((*s_etat_processus).affichage_arguments == 'Y ')
(gdb) next
1240 else if ((*s_etat_processus).test_instruction == 'Y')
(gdb) next
1250 l_element_pile_systeme =
(*s_etat_processus).l_base_pile_systeme;
(gdb) next
1254 while((l_element_pile_systeme != NULL) && (presence _boucle
== d_faux))
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
(gdb) next
1256 printf("Boucle %dn", presence_boucle);
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
(gdb) next
1256 printf("Boucle %dn", presence_boucle);
(gdb) next
Boucle 0
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
1258 (strcmp((*l_element_pile_syst eme).type_cloture,
"FOR") == 0))
(gdb) next
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1272 printf("<%s> %dn", (*l_element_pile_systeme).type_cloture,
presence_boucle);
...
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
(gdb) next
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1267 printf("Icin");
(gdb) next
Ici
1272 printf("<%s> %dn", (*l_element_pile_systeme).type_cloture,
presence_boucle);
(gdb) next
<WHILE> 255
1274 printf("<> %dn", presence_boucle);
(gdb) next
<> 255
1284 if ((*s_etat_processus).mode_execution_programme = = 'Y')
(gdb)
Je suis sorti normalement de la boucle...
JKB
--
Le cerveau, c'est un véritable scandale écologique. Il représente 2 % de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Le 17-10-2009, ? propos de
Re: Problème bizarre,
michko ?crivait dans fr.comp.lang.c :
> Sans doute un pb memoire, plutot que gdb, utilise
> un outil comme valgrind, ou bien donne un code
J'ai utilisé un valgrind qui n'a _rien_ trouvé. De to ute façon, je
ne vois pas comment avoir une corruption mémoire dans c e bout de
code, les seules variables touchées sont les deux drape aux. Le reste
n'est accédé qu'en lecture et il n'y a aucun thread p arallèle qui
pourrait modifier cette variable dans mon dos.
> complet. Par ailleurs, ton test sur printf me semble
> un peu superflu...
C'est simplement pour voir la valeur du drapeau _avant_ l e test.
Le souci, c'est que ça fonctionne parfaitement sous gdb en pas à pas.
Si je l'exécute sous gdb sans passer sur la fonction en question en pas à pas,
le truc plante de la même façon qu'en exécution normale :
(gdb) run -scp recherche_adresse.rpl
Starting program: /usr/local/bin/rpl -scp recherche_adresse.rpl
[Thread debugging using libthread_db enabled]
+++RPL/2 (R) version 4.0.7 (vendredi 16/10/2009, 22:11:12 CEST)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël>2<
Boucle 0
<IF> 0
<> 0
Boucle 0
Ici
<WHILE> 255
<> 255
Boucle 0
<> 0
<> 0
Boucle 0
<> 0
<> 0
Paf
+++Erreur : Instruction 'EXIT' hors d'une boucle [19895]
Program exited with code 01.
(gdb) break instruction_exit
(gdb) run -scp recherche_adresse.rpl
Starting program: /usr/local/bin/rpl -scp recherche_adresse.rpl
[Thread debugging using libthread_db enabled]
+++RPL/2 (R) version 4.0.7 (vendredi 16/10/2009, 22:11:12 CEST)
+++Copyright (C) 1989 à 2008, 2009 BERTRAND Joël
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
warning: Source file is more recent than executable.
1179 {
(gdb) cont
Continuing.
Breakpoin 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
1179 {
(gdb) cont
Continuing.
>2<
Breakpoint 1, instruction_exit (s_etat_processus=0xab7b10)
at instructions_e2.conv.c:1179
1179 {
(gdb) next
1195 (*s_etat_processus).erreur_execution = d_ex;
(gdb) next
1197 if ((*s_etat_processus).affichage_arguments == 'Y ')
(gdb) next
1240 else if ((*s_etat_processus).test_instruction == 'Y')
(gdb) next
1250 l_element_pile_systeme =
(*s_etat_processus).l_base_pile_systeme;
(gdb) next
1254 while((l_element_pile_systeme != NULL) && (presence _boucle
== d_faux))
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
(gdb) next
1256 printf("Boucle %dn", presence_boucle);
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
(gdb) next
1256 printf("Boucle %dn", presence_boucle);
(gdb) next
Boucle 0
1257 if ((strcmp((*l_element_pile_systeme).type_cl oture,
"START") == 0) ||
1258 (strcmp((*l_element_pile_syst eme).type_cloture,
"FOR") == 0))
(gdb) next
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1272 printf("<%s> %dn", (*l_element_pile_systeme).type_cloture,
presence_boucle);
...
(gdb) next
1265 (strcmp((*l_element_pile_syst eme).type_cloture,
"WHILE") == 0))
(gdb) next
1264 else if ((strcmp((*l_element_pile_systeme).ty pe_cloture,
"DO") == 0) ||
(gdb) next
1267 printf("Icin");
(gdb) next
Ici
1272 printf("<%s> %dn", (*l_element_pile_systeme).type_cloture,
presence_boucle);
(gdb) next
<WHILE> 255
1274 printf("<> %dn", presence_boucle);
(gdb) next
<> 255
1284 if ((*s_etat_processus).mode_execution_programme = = 'Y')
(gdb)
Je suis sorti normalement de la boucle...
JKB
--
Le cerveau, c'est un véritable scandale écologique. Il représente 2 % de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Eh bien, je vois tout de meme dans ton code un certain nombre
d'affectations, et donc...
Pour ma part, j'ai peine a croire a un bug de gcc dans un tel code et
comme concernant
un programme, je suis comme saint-thomas, et je prefererai que tu
nous donnes le resultat
de la compilation avec gcc -g -Wall suivi de l'output de valgrind.
Plutot que des printf
a droite/a gauche dans ton code, une session gdb avec des displays et
whatis bien choisis
pour nous informer sur la nature des variables mises en jeux. Enfin,
c'est un peu desagreable
de voir des sessions gdb qui ne correspondent pas aux sources !
Choisant une ( l'originale ?),
Eh bien, je vois tout de meme dans ton code un certain nombre
d'affectations, et donc...
Pour ma part, j'ai peine a croire a un bug de gcc dans un tel code et
comme concernant
un programme, je suis comme saint-thomas, et je prefererai que tu
nous donnes le resultat
de la compilation avec gcc -g -Wall suivi de l'output de valgrind.
Plutot que des printf
a droite/a gauche dans ton code, une session gdb avec des displays et
whatis bien choisis
pour nous informer sur la nature des variables mises en jeux. Enfin,
c'est un peu desagreable
de voir des sessions gdb qui ne correspondent pas aux sources !
Choisant une ( l'originale ?),
Eh bien, je vois tout de meme dans ton code un certain nombre
d'affectations, et donc...
Pour ma part, j'ai peine a croire a un bug de gcc dans un tel code et
comme concernant
un programme, je suis comme saint-thomas, et je prefererai que tu
nous donnes le resultat
de la compilation avec gcc -g -Wall suivi de l'output de valgrind.
Plutot que des printf
a droite/a gauche dans ton code, une session gdb avec des displays et
whatis bien choisis
pour nous informer sur la nature des variables mises en jeux. Enfin,
c'est un peu desagreable
de voir des sessions gdb qui ne correspondent pas aux sources !
Choisant une ( l'originale ?),
Le 19-10-2009, ? propos de
En dehors d'un bug sournois dans gcc provoqué par quelque chose
écrit bien avant dans le même fichier source, je ne vois pas.
Le 19-10-2009, ? propos de
En dehors d'un bug sournois dans gcc provoqué par quelque chose
écrit bien avant dans le même fichier source, je ne vois pas.
Le 19-10-2009, ? propos de
En dehors d'un bug sournois dans gcc provoqué par quelque chose
écrit bien avant dans le même fichier source, je ne vois pas.
"JKB" a écrit dans le message de groupe de
discussion :Le 19-10-2009, ? propos de
En dehors d'un bug sournois dans gcc provoqué par quelque chose
écrit bien avant dans le même fichier source, je ne vois pas.
Ne m'en veut pas : mais, comme ça juste à l'intuition et par expérience,
dire que GCC buggue, avec juste pour preuve un extrait de code simplissime,
qui ne compile pas tel quel, me parait un peu ... anticipé comme
constatation.
C'est typique d'un programme qui tombe en marche.
Sauf si tu présente un code exploitable et reproduisant le défaut, il est
fort à parier que l'erreur provient de ton application.
"JKB" <knatschke@koenigsberg.fr> a écrit dans le message de groupe de
discussion : slrnhdo6le.5ai.knatschke@rayleigh.systella.fr...
Le 19-10-2009, ? propos de
En dehors d'un bug sournois dans gcc provoqué par quelque chose
écrit bien avant dans le même fichier source, je ne vois pas.
Ne m'en veut pas : mais, comme ça juste à l'intuition et par expérience,
dire que GCC buggue, avec juste pour preuve un extrait de code simplissime,
qui ne compile pas tel quel, me parait un peu ... anticipé comme
constatation.
C'est typique d'un programme qui tombe en marche.
Sauf si tu présente un code exploitable et reproduisant le défaut, il est
fort à parier que l'erreur provient de ton application.
"JKB" a écrit dans le message de groupe de
discussion :Le 19-10-2009, ? propos de
En dehors d'un bug sournois dans gcc provoqué par quelque chose
écrit bien avant dans le même fichier source, je ne vois pas.
Ne m'en veut pas : mais, comme ça juste à l'intuition et par expérience,
dire que GCC buggue, avec juste pour preuve un extrait de code simplissime,
qui ne compile pas tel quel, me parait un peu ... anticipé comme
constatation.
C'est typique d'un programme qui tombe en marche.
Sauf si tu présente un code exploitable et reproduisant le défaut, il est
fort à parier que l'erreur provient de ton application.
Ce qui m'a fait mettre le comportement de gcc en doute, ce sont deux
choses. Dans un premier temps : j'ai coupé le fichier en question en deux.
D'un côté la fonction dans laquelle la boucle en question se situe, de
l'autre le reste du .c fautif. Le code source n'a donc pas changé.
Avec le même compilo et les mêmes options de compilation, ça fonctionne.
Je pense que si mon code avait un problème (ce que note bien j'accepterai,
ce n'est pas parce que je fais du C depuis vingt ans que je n'écris
pas de conn^Wbêtises ...), il aurait exactement le même problème dans
le cas d'un autre découpage des fichiers sources.
Ce qui m'a fait mettre le comportement de gcc en doute, ce sont deux
choses. Dans un premier temps : j'ai coupé le fichier en question en deux.
D'un côté la fonction dans laquelle la boucle en question se situe, de
l'autre le reste du .c fautif. Le code source n'a donc pas changé.
Avec le même compilo et les mêmes options de compilation, ça fonctionne.
Je pense que si mon code avait un problème (ce que note bien j'accepterai,
ce n'est pas parce que je fais du C depuis vingt ans que je n'écris
pas de conn^Wbêtises ...), il aurait exactement le même problème dans
le cas d'un autre découpage des fichiers sources.
Ce qui m'a fait mettre le comportement de gcc en doute, ce sont deux
choses. Dans un premier temps : j'ai coupé le fichier en question en deux.
D'un côté la fonction dans laquelle la boucle en question se situe, de
l'autre le reste du .c fautif. Le code source n'a donc pas changé.
Avec le même compilo et les mêmes options de compilation, ça fonctionne.
Je pense que si mon code avait un problème (ce que note bien j'accepterai,
ce n'est pas parce que je fais du C depuis vingt ans que je n'écris
pas de conn^Wbêtises ...), il aurait exactement le même problème dans
le cas d'un autre découpage des fichiers sources.
Mais je n'en veut à personne... Le fait est que ce bout de code
tournait depuis des années, que j'ai recompilé avec u n compilo plus
while((l_element_pile_systeme != NULL) && (presence_bou cle = d_faux))
{
}
avec une égalité et non un test. En fait, avec l'opti on -O3, ces
Mais je n'en veut à personne... Le fait est que ce bout de code
tournait depuis des années, que j'ai recompilé avec u n compilo plus
while((l_element_pile_systeme != NULL) && (presence_bou cle = d_faux))
{
}
avec une égalité et non un test. En fait, avec l'opti on -O3, ces
Mais je n'en veut à personne... Le fait est que ce bout de code
tournait depuis des années, que j'ai recompilé avec u n compilo plus
while((l_element_pile_systeme != NULL) && (presence_bou cle = d_faux))
{
}
avec une égalité et non un test. En fait, avec l'opti on -O3, ces
On 19 oct, 15:57, JKB wrote:Mais je n'en veut à personne... Le fait est que ce bout de code
tournait depuis des années, que j'ai recompilé avec un compilo plus
Mais ça ne prouve pas qu'il soit exempt de bug, notamment de
comportement indéfini...
while((l_element_pile_systeme != NULL) && (presence_boucle = d_faux))
{
}
avec une égalité et non un test. En fait, avec l'option -O3, ces
C'est quoi une égalité ? Tu veux dire une affectation ?
(presence_boucle = d_faux).
En 20 ans de C, tu ne connais pas encore les termes corrects ?
Tu sous entend que dès qu'un des termes de l'expression (en partant de
la gauche) avec des && vait 0, les autres de sont pas évalués. C'est
certainement vrai pour des expression pures (comparaisons),
par exemple, le très classique : while (p != NULL && *p != 0) p++;
mais pas sûr que ce soit vrai si il y a des affectations dans
l'expression... Il est possible que ça dépende de l'implémentation,
d'où un changement de comportement quand tu changes de compilateur.
On 19 oct, 15:57, JKB <knatsc...@koenigsberg.fr> wrote:
Mais je n'en veut à personne... Le fait est que ce bout de code
tournait depuis des années, que j'ai recompilé avec un compilo plus
Mais ça ne prouve pas qu'il soit exempt de bug, notamment de
comportement indéfini...
while((l_element_pile_systeme != NULL) && (presence_boucle = d_faux))
{
}
avec une égalité et non un test. En fait, avec l'option -O3, ces
C'est quoi une égalité ? Tu veux dire une affectation ?
(presence_boucle = d_faux).
En 20 ans de C, tu ne connais pas encore les termes corrects ?
Tu sous entend que dès qu'un des termes de l'expression (en partant de
la gauche) avec des && vait 0, les autres de sont pas évalués. C'est
certainement vrai pour des expression pures (comparaisons),
par exemple, le très classique : while (p != NULL && *p != 0) p++;
mais pas sûr que ce soit vrai si il y a des affectations dans
l'expression... Il est possible que ça dépende de l'implémentation,
d'où un changement de comportement quand tu changes de compilateur.
On 19 oct, 15:57, JKB wrote:Mais je n'en veut à personne... Le fait est que ce bout de code
tournait depuis des années, que j'ai recompilé avec un compilo plus
Mais ça ne prouve pas qu'il soit exempt de bug, notamment de
comportement indéfini...
while((l_element_pile_systeme != NULL) && (presence_boucle = d_faux))
{
}
avec une égalité et non un test. En fait, avec l'option -O3, ces
C'est quoi une égalité ? Tu veux dire une affectation ?
(presence_boucle = d_faux).
En 20 ans de C, tu ne connais pas encore les termes corrects ?
Tu sous entend que dès qu'un des termes de l'expression (en partant de
la gauche) avec des && vait 0, les autres de sont pas évalués. C'est
certainement vrai pour des expression pures (comparaisons),
par exemple, le très classique : while (p != NULL && *p != 0) p++;
mais pas sûr que ce soit vrai si il y a des affectations dans
l'expression... Il est possible que ça dépende de l'implémentation,
d'où un changement de comportement quand tu changes de compilateur.
> mais pas sûr que ce soit vrai si il y a des affectations dans
> l'expression... Il est possible que ça dépende de l'implémentatio n,
> d'où un changement de comportement quand tu changes de compilateur.
Il n'y a _aucune_ affectation dans l'expression, rien du tout. Le
compilo génère un code assembleur dans certains cas a vec
certaines options de compilation qui proviendrait plus de
while((l_element_pile_systeme != NULL) && (presence_bou cle = d_faux))
que de
while((l_element_pile_systeme != NULL) && (presence_bou cle == d_faux))
Je vais donc clore la discussion qui est plus un problè me de compilo
qu'un problème de C.
> mais pas sûr que ce soit vrai si il y a des affectations dans
> l'expression... Il est possible que ça dépende de l'implémentatio n,
> d'où un changement de comportement quand tu changes de compilateur.
Il n'y a _aucune_ affectation dans l'expression, rien du tout. Le
compilo génère un code assembleur dans certains cas a vec
certaines options de compilation qui proviendrait plus de
while((l_element_pile_systeme != NULL) && (presence_bou cle = d_faux))
que de
while((l_element_pile_systeme != NULL) && (presence_bou cle == d_faux))
Je vais donc clore la discussion qui est plus un problè me de compilo
qu'un problème de C.
> mais pas sûr que ce soit vrai si il y a des affectations dans
> l'expression... Il est possible que ça dépende de l'implémentatio n,
> d'où un changement de comportement quand tu changes de compilateur.
Il n'y a _aucune_ affectation dans l'expression, rien du tout. Le
compilo génère un code assembleur dans certains cas a vec
certaines options de compilation qui proviendrait plus de
while((l_element_pile_systeme != NULL) && (presence_bou cle = d_faux))
que de
while((l_element_pile_systeme != NULL) && (presence_bou cle == d_faux))
Je vais donc clore la discussion qui est plus un problè me de compilo
qu'un problème de C.