#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
Le resultat est sensé etre 3 3 4 (arguments de droite a gauche),
Si quelqu'un avait une explication a ca, je suis preneur :)
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
Le resultat est sensé etre 3 3 4 (arguments de droite a gauche),
Si quelqu'un avait une explication a ca, je suis preneur :)
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
Le resultat est sensé etre 3 3 4 (arguments de droite a gauche),
Si quelqu'un avait une explication a ca, je suis preneur :)
Salut a tous,
On m'a posé devant un "bug" que je n'ai pas su expliquer.
Alors, le code :
8<---------- snip
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
8<---------- snip
(rendu valide pour eviter les remarques ;)
Voila. Le probleme en lui meme : Voila ce que me sortent les differents
programmes compilés, suivant les compilos utilisés :
Gcc 3.3.5 x86 linux sans optim (-o0) : 3 3 4
Gcc 3.3.5 x86 linux avec optim (-o6) : 3 4 4
Visual C++ 6 Debug : 3 3 4
Visual C++ 6 Release : 3 4 4
Forte7 UltraSPARC III Solaris sans optim : 3 4 4
Forte7 UltraSPARC III Solaris avec optim : 3 4 4
Gcc 2.95 UltraSPARC III Solaris sans optim : 3 4 4
Gcc 2.95 UltraSPARC III Solaris avec optim : 3 4 4
Le resultat est sensé etre 3 3 4 (arguments de droite a gauche), selon
moi. Probleme, non seulement tous les compilos ne donnent pas ca, mais
en plus un meme compilo, suivant ses optims, peut donner un resultat
different pour un code similaire.
(Le passage a une fonction n'est pas obligatoire, afficher un printf("%d
%d %dn", i++, --i, ++i); donne le meme bug il me semble)
Si quelqu'un avait une explication a ca, je suis preneur :)
Merci bieng.
--
Jean-Yves Lamoureux
Salut a tous,
On m'a posé devant un "bug" que je n'ai pas su expliquer.
Alors, le code :
8<---------- snip
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
8<---------- snip
(rendu valide pour eviter les remarques ;)
Voila. Le probleme en lui meme : Voila ce que me sortent les differents
programmes compilés, suivant les compilos utilisés :
Gcc 3.3.5 x86 linux sans optim (-o0) : 3 3 4
Gcc 3.3.5 x86 linux avec optim (-o6) : 3 4 4
Visual C++ 6 Debug : 3 3 4
Visual C++ 6 Release : 3 4 4
Forte7 UltraSPARC III Solaris sans optim : 3 4 4
Forte7 UltraSPARC III Solaris avec optim : 3 4 4
Gcc 2.95 UltraSPARC III Solaris sans optim : 3 4 4
Gcc 2.95 UltraSPARC III Solaris avec optim : 3 4 4
Le resultat est sensé etre 3 3 4 (arguments de droite a gauche), selon
moi. Probleme, non seulement tous les compilos ne donnent pas ca, mais
en plus un meme compilo, suivant ses optims, peut donner un resultat
different pour un code similaire.
(Le passage a une fonction n'est pas obligatoire, afficher un printf("%d
%d %dn", i++, --i, ++i); donne le meme bug il me semble)
Si quelqu'un avait une explication a ca, je suis preneur :)
Merci bieng.
--
Jean-Yves Lamoureux
Salut a tous,
On m'a posé devant un "bug" que je n'ai pas su expliquer.
Alors, le code :
8<---------- snip
#include <stdio.h>
void f(int a, int b, int c) { printf("%i %i %i", a, b, c); }
int main(int argc, char *argv[])
{
int i = 3;
f(i++, --i, ++i);
return 0;
}
8<---------- snip
(rendu valide pour eviter les remarques ;)
Voila. Le probleme en lui meme : Voila ce que me sortent les differents
programmes compilés, suivant les compilos utilisés :
Gcc 3.3.5 x86 linux sans optim (-o0) : 3 3 4
Gcc 3.3.5 x86 linux avec optim (-o6) : 3 4 4
Visual C++ 6 Debug : 3 3 4
Visual C++ 6 Release : 3 4 4
Forte7 UltraSPARC III Solaris sans optim : 3 4 4
Forte7 UltraSPARC III Solaris avec optim : 3 4 4
Gcc 2.95 UltraSPARC III Solaris sans optim : 3 4 4
Gcc 2.95 UltraSPARC III Solaris avec optim : 3 4 4
Le resultat est sensé etre 3 3 4 (arguments de droite a gauche), selon
moi. Probleme, non seulement tous les compilos ne donnent pas ca, mais
en plus un meme compilo, suivant ses optims, peut donner un resultat
different pour un code similaire.
(Le passage a une fonction n'est pas obligatoire, afficher un printf("%d
%d %dn", i++, --i, ++i); donne le meme bug il me semble)
Si quelqu'un avait une explication a ca, je suis preneur :)
Merci bieng.
--
Jean-Yves Lamoureux
Jylam wrote:int i = 3;
f(i++, --i, ++i);
L'ordre d'évaluation des arguments n'est pas définit dans la norme.
Pour ce cas, l'évaluation du paramètre b et c peut changer.
Les valeurs attenduent sont 2 3 ou 3 4.
Les compilateurs affichant d'autres résulat sont simplement bogués.
Ce genre de codage est plus un piège à compilateur....
Jylam wrote:
int i = 3;
f(i++, --i, ++i);
L'ordre d'évaluation des arguments n'est pas définit dans la norme.
Pour ce cas, l'évaluation du paramètre b et c peut changer.
Les valeurs attenduent sont 2 3 ou 3 4.
Les compilateurs affichant d'autres résulat sont simplement bogués.
Ce genre de codage est plus un piège à compilateur....
Jylam wrote:int i = 3;
f(i++, --i, ++i);
L'ordre d'évaluation des arguments n'est pas définit dans la norme.
Pour ce cas, l'évaluation du paramètre b et c peut changer.
Les valeurs attenduent sont 2 3 ou 3 4.
Les compilateurs affichant d'autres résulat sont simplement bogués.
Ce genre de codage est plus un piège à compilateur....
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant f)
(pour respecter l'ordre de passage des paramètres)
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant f)
(pour respecter l'ordre de passage des paramètres)
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant f)
(pour respecter l'ordre de passage des paramètres)
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant f)
(pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les options
Il n'y a pas de "bug", même avec des guillemets. La norme est claire,
d'optimisation, le processeur etc, les paramètres peuvent être passés de
manières bien différentes non ? Genre sur la pile, ou certains sur la
pile, d'autres sur les registres ...
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
Enfin c'est vraiment la seule piste qui me vient à l'esprit, surtout que
Jean-Yves a bien attiré notre attention sur le fait qu'un même
compilateur, avec des options de compilation différentes, donne des
résultats différents ...
Ce ne peut être une explication. En effet, la première optimisation qui
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant f)
(pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les options
Il n'y a pas de "bug", même avec des guillemets. La norme est claire,
d'optimisation, le processeur etc, les paramètres peuvent être passés de
manières bien différentes non ? Genre sur la pile, ou certains sur la
pile, d'autres sur les registres ...
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
Enfin c'est vraiment la seule piste qui me vient à l'esprit, surtout que
Jean-Yves a bien attiré notre attention sur le fait qu'un même
compilateur, avec des options de compilation différentes, donne des
résultats différents ...
Ce ne peut être une explication. En effet, la première optimisation qui
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant f)
(pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les options
Il n'y a pas de "bug", même avec des guillemets. La norme est claire,
d'optimisation, le processeur etc, les paramètres peuvent être passés de
manières bien différentes non ? Genre sur la pile, ou certains sur la
pile, d'autres sur les registres ...
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
Enfin c'est vraiment la seule piste qui me vient à l'esprit, surtout que
Jean-Yves a bien attiré notre attention sur le fait qu'un même
compilateur, avec des options de compilation différentes, donne des
résultats différents ...
Ce ne peut être une explication. En effet, la première optimisation qui
Les résultats en release sont
d'ailleurs étonnants:
VC6:
; 8 : int i = 3;
; 9 : f(i++, --i, ++i);
push 4
push 4
push 3
call _f
VC6 /Ob2:
push 4
push 3
push 3
push OFFSET FLAT:??@?$CFi?5?$CFi?5?$CFi?6?$AA@ ; `string'
call _printf
VC7.1
push 3
push 3
push 3
push OFFSET FLAT:??@?$CFi?5?$CFi?5?$CFi?6?$AA@
call _printf
Les résultats en release sont
d'ailleurs étonnants:
VC6:
; 8 : int i = 3;
; 9 : f(i++, --i, ++i);
push 4
push 4
push 3
call _f
VC6 /Ob2:
push 4
push 3
push 3
push OFFSET FLAT:??_C@_09KDGF@?$CFi?5?$CFi?5?$CFi?6?$AA@ ; `string'
call _printf
VC7.1
push 3
push 3
push 3
push OFFSET FLAT:??_C@_09OFANCKDA@?$CFi?5?$CFi?5?$CFi?6?$AA@
call _printf
Les résultats en release sont
d'ailleurs étonnants:
VC6:
; 8 : int i = 3;
; 9 : f(i++, --i, ++i);
push 4
push 4
push 3
call _f
VC6 /Ob2:
push 4
push 3
push 3
push OFFSET FLAT:??@?$CFi?5?$CFi?5?$CFi?6?$AA@ ; `string'
call _printf
VC7.1
push 3
push 3
push 3
push OFFSET FLAT:??@?$CFi?5?$CFi?5?$CFi?6?$AA@
call _printf
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant
f)
(pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les options
Il n'y a pas de "bug", même avec des guillemets. La norme est claire,
l'ordre d'évaluation est "unspecied". La seule certitude, c'est que i
vaudra 4 au retour de la fonction (en fait, juste avant le saut vers la
fonction).
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant
f)
(pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les options
Il n'y a pas de "bug", même avec des guillemets. La norme est claire,
l'ordre d'évaluation est "unspecied". La seule certitude, c'est que i
vaudra 4 au retour de la fonction (en fait, juste avant le saut vers la
fonction).
Je veux bien comprendre que l'on rajoute une contrainte b) avant d) avant
f)
(pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les options
Il n'y a pas de "bug", même avec des guillemets. La norme est claire,
l'ordre d'évaluation est "unspecied". La seule certitude, c'est que i
vaudra 4 au retour de la fonction (en fait, juste avant le saut vers la
fonction).
Il n'y a pas de "bug", même avec des guillemets. La norme est
claire, l'ordre d'évaluation est "unspecied". La seule certitude,
c'est que i vaudra 4 au retour de la fonction (en fait, juste
avant le saut vers la fonction).
En fait je pense que cette certitude n'est pas du tout fondée.
D'après la norme, lire plusieurs fois la valeur d'un variable
modifiee par effet de bord entre deux points de séquence est un cas
de unspecified behaviour, a fortiori la modifier par effet de bord
plusieurs fois !
Bref ce truc est interdit.
Il n'y a pas de "bug", même avec des guillemets. La norme est
claire, l'ordre d'évaluation est "unspecied". La seule certitude,
c'est que i vaudra 4 au retour de la fonction (en fait, juste
avant le saut vers la fonction).
En fait je pense que cette certitude n'est pas du tout fondée.
D'après la norme, lire plusieurs fois la valeur d'un variable
modifiee par effet de bord entre deux points de séquence est un cas
de unspecified behaviour, a fortiori la modifier par effet de bord
plusieurs fois !
Bref ce truc est interdit.
Il n'y a pas de "bug", même avec des guillemets. La norme est
claire, l'ordre d'évaluation est "unspecied". La seule certitude,
c'est que i vaudra 4 au retour de la fonction (en fait, juste
avant le saut vers la fonction).
En fait je pense que cette certitude n'est pas du tout fondée.
D'après la norme, lire plusieurs fois la valeur d'un variable
modifiee par effet de bord entre deux points de séquence est un cas
de unspecified behaviour, a fortiori la modifier par effet de bord
plusieurs fois !
Bref ce truc est interdit.
Je veux bien comprendre que l'on rajoute une contrainte b) avant d)
avant f) (pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les
options
Il n'y a pas de "bug", même avec des guillemets.
La norme est claire, l'ordre d'évaluation est "unspecied". La seule
certitude, c'est que i vaudra 4 au retour de la fonction (en fait,
juste avant le saut vers la fonction).
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
Je veux bien comprendre que l'on rajoute une contrainte b) avant d)
avant f) (pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les
options
Il n'y a pas de "bug", même avec des guillemets.
La norme est claire, l'ordre d'évaluation est "unspecied". La seule
certitude, c'est que i vaudra 4 au retour de la fonction (en fait,
juste avant le saut vers la fonction).
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
Je veux bien comprendre que l'on rajoute une contrainte b) avant d)
avant f) (pour respecter l'ordre de passage des paramètres)
Justement, le "bug" ne pourrait-il pas venir de là ? Selon les
options
Il n'y a pas de "bug", même avec des guillemets.
La norme est claire, l'ordre d'évaluation est "unspecied". La seule
certitude, c'est que i vaudra 4 au retour de la fonction (en fait,
juste avant le saut vers la fonction).
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.