-ed- a écrit :
int main (void) {
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
*pi = 0; /* accès 16-bit a une adresse impaire : BERR */
return 0; }
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
et ce malgré le cast en int * lors e l'initialisation?
Et si c'est un problème d'alignement, quel § de la norme n'est pas
-ed- a écrit :
int main (void) {
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
*pi = 0; /* accès 16-bit a une adresse impaire : BERR */
return 0; }
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
et ce malgré le cast en int * lors e l'initialisation?
Et si c'est un problème d'alignement, quel § de la norme n'est pas
-ed- a écrit :
int main (void) {
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
*pi = 0; /* accès 16-bit a une adresse impaire : BERR */
return 0; }
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
et ce malgré le cast en int * lors e l'initialisation?
Et si c'est un problème d'alignement, quel § de la norme n'est pas
Ce qu'il faut bien comprendre quand quelqu'un produit un énoncé entaché
d'une erreur, c'est que le comportement du lecteur peut être
complètement indéterminé (un lecteur de fclc doit comprendre ce genre
d'image).
Ce qu'il faut bien comprendre quand quelqu'un produit un énoncé entaché
d'une erreur, c'est que le comportement du lecteur peut être
complètement indéterminé (un lecteur de fclc doit comprendre ce genre
d'image).
Ce qu'il faut bien comprendre quand quelqu'un produit un énoncé entaché
d'une erreur, c'est que le comportement du lecteur peut être
complètement indéterminé (un lecteur de fclc doit comprendre ce genre
d'image).
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int.
On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
??????????
C'est un exemple de comportement sur une architecture. La norme n'a
justement rien à voir là-dedans.
Pour être plus précis, la norme "sait" que l'alignement est une notion
importante, mais elle ne peut pas le prendre en charge de façon
portable.
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int.
On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
??????????
C'est un exemple de comportement sur une architecture. La norme n'a
justement rien à voir là-dedans.
Pour être plus précis, la norme "sait" que l'alignement est une notion
importante, mais elle ne peut pas le prendre en charge de façon
portable.
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int.
On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
??????????
C'est un exemple de comportement sur une architecture. La norme n'a
justement rien à voir là-dedans.
Pour être plus précis, la norme "sait" que l'alignement est une notion
importante, mais elle ne peut pas le prendre en charge de façon
portable.
On 2008-11-25, candide wrote:[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Je l'ai fait dans mon post dans ce fil de discussion.
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
Comme déjà dit, par défaut, les processeurs x86 acceptent les accès
non alignés, au prix d'une perte de performances.
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Mais tu n'as pas le droit justement.
On 2008-11-25, candide <candide@free.invalid> wrote:
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Je l'ai fait dans mon post dans ce fil de discussion.
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
Comme déjà dit, par défaut, les processeurs x86 acceptent les accès
non alignés, au prix d'une perte de performances.
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Mais tu n'as pas le droit justement.
On 2008-11-25, candide wrote:[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Je l'ai fait dans mon post dans ce fil de discussion.
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
Comme déjà dit, par défaut, les processeurs x86 acceptent les accès
non alignés, au prix d'une perte de performances.
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Mais tu n'as pas le droit justement.
En news:492bdb97$0$6693$, candide va escriure:-ed- a écrit :
[ et j'ai simplifié ]int main (void) {
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
*pi = 0; /* accès 16-bit a une adresse impaire : BERR */
return 0; }Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
Oui. Sur une machine sans contrainte d'alignement, ce code passe sans souci.
Sur une machine qui a de telles contraintes, cela hurle.
En fait, il y a même des machines où cela sera refusé à la compilation
(notament si les pointeurs vers int sont moins larges que les pointeurs vers
char).
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
???
Tu assignes 0 à l'*objet* référencé par le pointeur pi, qui est aussi
l'objet référencé par le pointeur x,
qui a la même adresse que le multiplet
(/byte/) qui suit
le début de x, autrement dit quelque part dans la
représentation de x[0] (et peut-être de x[1], sur une machine 32 bits).
S'il n'y a pas de problème d'accès arbitraire à la mémoire,
tu vas écraser
certaines des bits de x[0], mais la machine va te laisser faire.
S'il y en
a, la machine va te rebrouer.
et ce malgré le cast en int * lors e l'initialisation?
Le transtypage en int* n'est là que pour faire taire le compilateur.
Et si c'est un problème d'alignement, quel § de la norme n'est pas
respecté ?
6.2.3.2p7, deuxième phrase.
En news:492bdb97$0$6693$426a74cc@news.free.fr, candide va escriure:
-ed- a écrit :
[ et j'ai simplifié ]
int main (void) {
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
*pi = 0; /* accès 16-bit a une adresse impaire : BERR */
return 0; }
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
Oui. Sur une machine sans contrainte d'alignement, ce code passe sans souci.
Sur une machine qui a de telles contraintes, cela hurle.
En fait, il y a même des machines où cela sera refusé à la compilation
(notament si les pointeurs vers int sont moins larges que les pointeurs vers
char).
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
???
Tu assignes 0 à l'*objet* référencé par le pointeur pi, qui est aussi
l'objet référencé par le pointeur x,
qui a la même adresse que le multiplet
(/byte/) qui suit
le début de x, autrement dit quelque part dans la
représentation de x[0] (et peut-être de x[1], sur une machine 32 bits).
S'il n'y a pas de problème d'accès arbitraire à la mémoire,
tu vas écraser
certaines des bits de x[0], mais la machine va te laisser faire.
S'il y en
a, la machine va te rebrouer.
et ce malgré le cast en int * lors e l'initialisation?
Le transtypage en int* n'est là que pour faire taire le compilateur.
Et si c'est un problème d'alignement, quel § de la norme n'est pas
respecté ?
6.2.3.2p7, deuxième phrase.
En news:492bdb97$0$6693$, candide va escriure:-ed- a écrit :
[ et j'ai simplifié ]int main (void) {
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
*pi = 0; /* accès 16-bit a une adresse impaire : BERR */
return 0; }Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
Oui. Sur une machine sans contrainte d'alignement, ce code passe sans souci.
Sur une machine qui a de telles contraintes, cela hurle.
En fait, il y a même des machines où cela sera refusé à la compilation
(notament si les pointeurs vers int sont moins larges que les pointeurs vers
char).
En quoi ai-je bien le droit d'affecter 0 à l'adresse pi
???
Tu assignes 0 à l'*objet* référencé par le pointeur pi, qui est aussi
l'objet référencé par le pointeur x,
qui a la même adresse que le multiplet
(/byte/) qui suit
le début de x, autrement dit quelque part dans la
représentation de x[0] (et peut-être de x[1], sur une machine 32 bits).
S'il n'y a pas de problème d'accès arbitraire à la mémoire,
tu vas écraser
certaines des bits de x[0], mais la machine va te laisser faire.
S'il y en
a, la machine va te rebrouer.
et ce malgré le cast en int * lors e l'initialisation?
Le transtypage en int* n'est là que pour faire taire le compilateur.
Et si c'est un problème d'alignement, quel § de la norme n'est pas
respecté ?
6.2.3.2p7, deuxième phrase.
La plupart du temps, on considere que candide ne constitue pas une
implementation conforme d'un lecteur valide de fclc. ;-)
La plupart du temps, on considere que candide ne constitue pas une
implementation conforme d'un lecteur valide de fclc. ;-)
La plupart du temps, on considere que candide ne constitue pas une
implementation conforme d'un lecteur valide de fclc. ;-)
Marc Boyer a écrit :On 2008-11-25, candide wrote:[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Je l'ai fait dans mon post dans ce fil de discussion.
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
Oui, j'avais lu mais je m'attendais pas à trouver de l'assembleur dans
le code C.
Comme déjà dit, par défaut, les processeurs x86 acceptent les accès
non alignés, au prix d'une perte de performances.
Oui mais j'aurais voulu, je sais pas comment dire, pas un
ralentissement, quelque chose d'interdit, d'invalide, qui engendre un
plantage (et écrit en C, pas en asssembleur).
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Mais tu n'as pas le droit justement.
Je ne comprends pas, tu dis le contraire de ce que dit Pierre Maurette
alors ?
Marc Boyer a écrit :
On 2008-11-25, candide <candide@free.invalid> wrote:
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Je l'ai fait dans mon post dans ce fil de discussion.
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
Oui, j'avais lu mais je m'attendais pas à trouver de l'assembleur dans
le code C.
Comme déjà dit, par défaut, les processeurs x86 acceptent les accès
non alignés, au prix d'une perte de performances.
Oui mais j'aurais voulu, je sais pas comment dire, pas un
ralentissement, quelque chose d'interdit, d'invalide, qui engendre un
plantage (et écrit en C, pas en asssembleur).
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Mais tu n'as pas le droit justement.
Je ne comprends pas, tu dis le contraire de ce que dit Pierre Maurette
alors ?
Marc Boyer a écrit :On 2008-11-25, candide wrote:[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Je l'ai fait dans mon post dans ce fil de discussion.
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
Oui, j'avais lu mais je m'attendais pas à trouver de l'assembleur dans
le code C.
Comme déjà dit, par défaut, les processeurs x86 acceptent les accès
non alignés, au prix d'une perte de performances.
Oui mais j'aurais voulu, je sais pas comment dire, pas un
ralentissement, quelque chose d'interdit, d'invalide, qui engendre un
plantage (et écrit en C, pas en asssembleur).
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Mais tu n'as pas le droit justement.
Je ne comprends pas, tu dis le contraire de ce que dit Pierre Maurette
alors ?
Dans le langage de la norme C, le code que j'ai écrit (sans le __asm__)
est un Undefined Behavior. Est-ce le sens que tu donnes à "interdit" ?
Quand à "engendrer un plantage", ben voilà, sous x86 tel que configuré
par défaut sur la plupart des OS, les erreurs d'alignement n'en provoquent
pas. Le code assembleur que j'ai introduit dans le C ne provoque pas
l'erreur d'alignement, il dit juste au processeur de provoquer un plantage
quand il y a une erreur d'alignement au lieu de tout rattrapper tout seul
comme un grand.
Je ne retrouve pas le message de Pierre où il dit cela.
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int. On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
Dans le langage de la norme C, le code que j'ai écrit (sans le __asm__)
est un Undefined Behavior. Est-ce le sens que tu donnes à "interdit" ?
Quand à "engendrer un plantage", ben voilà, sous x86 tel que configuré
par défaut sur la plupart des OS, les erreurs d'alignement n'en provoquent
pas. Le code assembleur que j'ai introduit dans le C ne provoque pas
l'erreur d'alignement, il dit juste au processeur de provoquer un plantage
quand il y a une erreur d'alignement au lieu de tout rattrapper tout seul
comme un grand.
Je ne retrouve pas le message de Pierre où il dit cela.
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int. On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
Dans le langage de la norme C, le code que j'ai écrit (sans le __asm__)
est un Undefined Behavior. Est-ce le sens que tu donnes à "interdit" ?
Quand à "engendrer un plantage", ben voilà, sous x86 tel que configuré
par défaut sur la plupart des OS, les erreurs d'alignement n'en provoquent
pas. Le code assembleur que j'ai introduit dans le C ne provoque pas
l'erreur d'alignement, il dit juste au processeur de provoquer un plantage
quand il y a une erreur d'alignement au lieu de tout rattrapper tout seul
comme un grand.
Je ne retrouve pas le message de Pierre où il dit cela.
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int. On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
Marc Boyer a écrit :
C'était là mais non explicite :Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int. On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
mais probablement ai-je mal compris sa réponse ce qui n'est que la
continuation du fait qu'il a mal compris ma question qui fait suite à ma
mauvaise interprétation d'une de ses phrases laquelle est due selon moi
à l'utilisation par lui d'une formulation inappropriée et non d'une
fausse candeur. Donc autant en rester là.
Marc Boyer a écrit :
C'était là mais non explicite :
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int. On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
mais probablement ai-je mal compris sa réponse ce qui n'est que la
continuation du fait qu'il a mal compris ma question qui fait suite à ma
mauvaise interprétation d'une de ses phrases laquelle est due selon moi
à l'utilisation par lui d'une formulation inappropriée et non d'une
fausse candeur. Donc autant en rester là.
Marc Boyer a écrit :
C'était là mais non explicite :Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
?????
pi est un int*, initialisé par un int* (le cast d'un char* en int*). *pi
est donc un int. On n'affecte pas 0 à pi.
On peut d'ailleurs affecter 0 à un pointeur, et on le fait très souvent.
Même la norme indique qu'il s'agit d'une des initialisations valides
d'un pointeur...
mais probablement ai-je mal compris sa réponse ce qui n'est que la
continuation du fait qu'il a mal compris ma question qui fait suite à ma
mauvaise interprétation d'une de ses phrases laquelle est due selon moi
à l'utilisation par lui d'une formulation inappropriée et non d'une
fausse candeur. Donc autant en rester là.
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi ,
et ce malgré le cast
en int * lors e l'initialisation? Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi ,
et ce malgré le cast
en int * lors e l'initialisation? Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi ,
et ce malgré le cast
en int * lors e l'initialisation? Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?