This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Bug in while() intrinsic ?
- From: BERTRAND Joel <joel dot bertrand at systella dot fr>
- To: gcc-help at gcc dot gnu dot org
- Date: Fri, 16 Oct 2009 18:58:38 +0200
- Subject: Bug in while() intrinsic ?
Hello,
I'm trying to debug a subroutine in a very long program. You can find
this GPL'd program at http://www.rpl2.net/.
In src/instructions_e2.c, line 1250, I have written :
l_element_pile_systeme = (*s_etat_processus).l_base_pile_systeme;
presence_boucle = d_faux;
drapeau_boucle_definie = d_faux;
while((l_element_pile_systeme != NULL) &&
(presence_boucle == d_faux))
{
printf("Boucle %d\n", 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("Ici\n");
presence_boucle = d_vrai;
drapeau_boucle_definie = d_faux;
}
printf("<%s> %d\n", (*l_element_pile_systeme).type_cloture,
presence_boucle);
l_element_pile_systeme = (*l_element_pile_systeme).suivant;
printf("<> %d\n", presence_boucle);
}
if (presence_boucle == d_faux)
{
printf("Paf\n");
(*s_etat_processus).erreur_execution = d_ex_exit_hors_boucle;
return;
}
presence_boucle and drapeau_boucle_definie are both unsigned char.
d_vrai is equal to (unsigned char) (-1) and d_faux to (unsigned char) 0.
l_element_pile_systeme is a structure that contains a field 'suivant'
that is a pointer to next element. type_cloture field is a char[6].
When I run this code, I obtain :
Boucle 0
<IF> 0
<> 0
Boucle 0
Ici
<WHILE> 255
<> 255
Boucle 0 <--- I don't understand why this variable is modified !
<> 0
<> 0
Boucle 0
<> 0
<> 0
Paf
+++Erreur : Instruction 'EXIT' hors d'une boucle [31196]
If I have written :
while((l_element_pile_systeme != NULL) && (presence_boucle = d_faux))
{
...
}
I could understand... But I have written :
while((l_element_pile_systeme != NULL) && (presence_boucle == d_faux))
{
...
}
I have tested with gcc-4.3 from debian, gcc-4.4.1 on both linux/sparc
and linux/amd64. On both systems, I have tried -O2 and -O3 flags without
any difference.
To reproduce : build program
(http://www.rpl2.net/download/rpl-4.0.6.tar.bz2) and execute the
following script :
#!/usr/local/bin/rpl -csp
MAIN
<<
"toto"
-> ADRESSE
<<
1 1
-> J N
<<
1 ADRESSE size for I
while
ADRESSE I dup sub " " same
repeat
'I' incr
if
I ADRESSE size >
then
exit
end
end
I 'J' sto
while
ADRESSE I dup sub " " same not
repeat
'I' incr
if
I ADRESSE size >
then
exit
end
end
ADRESSE J I 1 - sub
'N' incr
next
>>
clmf
>>
Any idea ?
Regards,
JKB