Avec ton raisonnement on ne pourrait pas faire :
char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ;
chaine = "pouet pouet"; NON
Avec ton raisonnement on ne pourrait pas faire :
char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ;
chaine = "pouet pouet"; NON
Avec ton raisonnement on ne pourrait pas faire :
char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ;
chaine = "pouet pouet"; NON
C'est, il me semble, egalement le cas pour "toto"[0]='X' ;
C'est, il me semble, egalement le cas pour "toto"[0]='X' ;
C'est, il me semble, egalement le cas pour "toto"[0]='X' ;
Juste pour etre bien sur de comprendre :
Un programme qui ferait :
scanf("%d", &index) ;
printf("%d", tab[index]) ;
serait interdit par la norme ?
On ne peut pas garantir que index sera dedans ou dehors les limites
de tab. On doit meme pouvoir en choisissant bien "index" taper
pile dans l'adresse d'une chaine constante.
Donc si je comprends bien c'est un UB.
Qu'est-ce qui ferait que ce programme serait du C legal, et mes
exemples non ?
Le fait que dans mes exemples on peut _statiquement_ prouver
qu'on va au devant de graves problemes ?
Mais dans ce cas ca voudrait dire que l'intelligence du compilo
a une influence sur la norme. Ou la norme fixe-t-elle un
niveau de facilite de detection, interdisant les erreurs "facilement
detectables" ?
*((char *)(0)) = ' ' ; est interdit ?
x = 0 ;
*((char *)(0+x)) = ' ' ?
Tes deux exemples sont causent egalement des UB. Le premier parce que tu
"crees" un pointeur vers une zone de memoire qui /a priori/ ne
t'appartient pas.
C'est interdit ?
Il me semblant que c'est plutot en le dereferencant que je faisait
une erreur _runtime_
char t[100] ;
char *p ;
char *end ;
p=&(t[0]) ;
end = p+100 ;
for(;p<end;p++) est alors interdit aussi je suppose.
Je connais des gens qui programment salement. Mais je n'ai encore jamais
vu qqn qui s'amuse a modifier des chaines constantes "pour de vrai".
Surtout que ce serait bien con, vu que, norme ou pas, ub ou pas,
ca peut faire un segfault, et la facon de creer les chaines constantes
depend du compilateur (ce qui etait d'ailleurs le point que j'illustrait
ici).
Juste pour etre bien sur de comprendre :
Un programme qui ferait :
scanf("%d", &index) ;
printf("%d", tab[index]) ;
serait interdit par la norme ?
On ne peut pas garantir que index sera dedans ou dehors les limites
de tab. On doit meme pouvoir en choisissant bien "index" taper
pile dans l'adresse d'une chaine constante.
Donc si je comprends bien c'est un UB.
Qu'est-ce qui ferait que ce programme serait du C legal, et mes
exemples non ?
Le fait que dans mes exemples on peut _statiquement_ prouver
qu'on va au devant de graves problemes ?
Mais dans ce cas ca voudrait dire que l'intelligence du compilo
a une influence sur la norme. Ou la norme fixe-t-elle un
niveau de facilite de detection, interdisant les erreurs "facilement
detectables" ?
*((char *)(0)) = ' ' ; est interdit ?
x = 0 ;
*((char *)(0+x)) = ' ' ?
Tes deux exemples sont causent egalement des UB. Le premier parce que tu
"crees" un pointeur vers une zone de memoire qui /a priori/ ne
t'appartient pas.
C'est interdit ?
Il me semblant que c'est plutot en le dereferencant que je faisait
une erreur _runtime_
char t[100] ;
char *p ;
char *end ;
p=&(t[0]) ;
end = p+100 ;
for(;p<end;p++) est alors interdit aussi je suppose.
Je connais des gens qui programment salement. Mais je n'ai encore jamais
vu qqn qui s'amuse a modifier des chaines constantes "pour de vrai".
Surtout que ce serait bien con, vu que, norme ou pas, ub ou pas,
ca peut faire un segfault, et la facon de creer les chaines constantes
depend du compilateur (ce qui etait d'ailleurs le point que j'illustrait
ici).
Juste pour etre bien sur de comprendre :
Un programme qui ferait :
scanf("%d", &index) ;
printf("%d", tab[index]) ;
serait interdit par la norme ?
On ne peut pas garantir que index sera dedans ou dehors les limites
de tab. On doit meme pouvoir en choisissant bien "index" taper
pile dans l'adresse d'une chaine constante.
Donc si je comprends bien c'est un UB.
Qu'est-ce qui ferait que ce programme serait du C legal, et mes
exemples non ?
Le fait que dans mes exemples on peut _statiquement_ prouver
qu'on va au devant de graves problemes ?
Mais dans ce cas ca voudrait dire que l'intelligence du compilo
a une influence sur la norme. Ou la norme fixe-t-elle un
niveau de facilite de detection, interdisant les erreurs "facilement
detectables" ?
*((char *)(0)) = ' ' ; est interdit ?
x = 0 ;
*((char *)(0+x)) = ' ' ?
Tes deux exemples sont causent egalement des UB. Le premier parce que tu
"crees" un pointeur vers une zone de memoire qui /a priori/ ne
t'appartient pas.
C'est interdit ?
Il me semblant que c'est plutot en le dereferencant que je faisait
une erreur _runtime_
char t[100] ;
char *p ;
char *end ;
p=&(t[0]) ;
end = p+100 ;
for(;p<end;p++) est alors interdit aussi je suppose.
Je connais des gens qui programment salement. Mais je n'ai encore jamais
vu qqn qui s'amuse a modifier des chaines constantes "pour de vrai".
Surtout que ce serait bien con, vu que, norme ou pas, ub ou pas,
ca peut faire un segfault, et la facon de creer les chaines constantes
depend du compilateur (ce qui etait d'ailleurs le point que j'illustrait
ici).
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
ok...les bras m'en tombent....
je me trimbalais cette certitude depuis toujours...
la honte... :-(
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
ok...les bras m'en tombent....
je me trimbalais cette certitude depuis toujours...
la honte... :-(
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
ok...les bras m'en tombent....
je me trimbalais cette certitude depuis toujours...
la honte... :-(
TEST *t = (TEST *)malloc(sizeof(TEST));
FILE *file;
t->txt = "pouet pouet";
t->x = 257;
file = fopen("fichier_test", "rb");
write(file,t->txt, strlen(t->txt));
write(file,&t->x, sizeof(int));fclose(file);
TEST *t = (TEST *)malloc(sizeof(TEST));
FILE *file;
t->txt = "pouet pouet";
t->x = 257;
file = fopen("fichier_test", "rb");
write(file,t->txt, strlen(t->txt));
write(file,&t->x, sizeof(int));
fclose(file);
TEST *t = (TEST *)malloc(sizeof(TEST));
FILE *file;
t->txt = "pouet pouet";
t->x = 257;
file = fopen("fichier_test", "rb");
write(file,t->txt, strlen(t->txt));
write(file,&t->x, sizeof(int));fclose(file);
Personne n'a dit qu'un UB était interdit par la norme. Il n'est pas interdit
d'écrire un UB, (sinon, ce ne serait pas un UB), mais il faut simplement être
conscient que la norme de définit pas tout, et que certaines syntaxes, bien
que légales, invoquent un UB. Se fier à la seule validité syntaxique ne
suffit pas à garantir que le code soit correct.
Encore une fois, un UB ne rend pas le code illegal, mais simplement
dangereux. On a le droit d'utiliser gets(), mais un professionel sérieux ne
le fera pas.
C'est précisément par ce que ça /peut/provoquer un segfault, que l'on parle
de UB. Il y a des systèmes qui accèptent ça sans rien dire, c'est pour ça
qu'un UB est si dangereux.
Personne n'a dit qu'un UB était interdit par la norme. Il n'est pas interdit
d'écrire un UB, (sinon, ce ne serait pas un UB), mais il faut simplement être
conscient que la norme de définit pas tout, et que certaines syntaxes, bien
que légales, invoquent un UB. Se fier à la seule validité syntaxique ne
suffit pas à garantir que le code soit correct.
Encore une fois, un UB ne rend pas le code illegal, mais simplement
dangereux. On a le droit d'utiliser gets(), mais un professionel sérieux ne
le fera pas.
C'est précisément par ce que ça /peut/provoquer un segfault, que l'on parle
de UB. Il y a des systèmes qui accèptent ça sans rien dire, c'est pour ça
qu'un UB est si dangereux.
Personne n'a dit qu'un UB était interdit par la norme. Il n'est pas interdit
d'écrire un UB, (sinon, ce ne serait pas un UB), mais il faut simplement être
conscient que la norme de définit pas tout, et que certaines syntaxes, bien
que légales, invoquent un UB. Se fier à la seule validité syntaxique ne
suffit pas à garantir que le code soit correct.
Encore une fois, un UB ne rend pas le code illegal, mais simplement
dangereux. On a le droit d'utiliser gets(), mais un professionel sérieux ne
le fera pas.
C'est précisément par ce que ça /peut/provoquer un segfault, que l'on parle
de UB. Il y a des systèmes qui accèptent ça sans rien dire, c'est pour ça
qu'un UB est si dangereux.
Bref, sans revenir sur le sujet initial (avec tous ces gens qui reviennent de
vacances ce vieux thread a ete rechauffe plusieurs fois), question :
- Un code contenant un UB est il illegal ou seulement dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale" bien sur.
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
[quand meme autre remarque au passage : mon code avait-il l'air
professionnel ? Bien entendu qu'un professionnel ne fait pas ca. C'etait
sense etre clair].
Bref, sans revenir sur le sujet initial (avec tous ces gens qui reviennent de
vacances ce vieux thread a ete rechauffe plusieurs fois), question :
- Un code contenant un UB est il illegal ou seulement dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale" bien sur.
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
[quand meme autre remarque au passage : mon code avait-il l'air
professionnel ? Bien entendu qu'un professionnel ne fait pas ca. C'etait
sense etre clair].
Bref, sans revenir sur le sujet initial (avec tous ces gens qui reviennent de
vacances ce vieux thread a ete rechauffe plusieurs fois), question :
- Un code contenant un UB est il illegal ou seulement dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale" bien sur.
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
[quand meme autre remarque au passage : mon code avait-il l'air
professionnel ? Bien entendu qu'un professionnel ne fait pas ca. C'etait
sense etre clair].
Bref, sans revenir sur le sujet initial (avec tous ces gens qui
reviennent de vacances ce vieux thread a ete rechauffe plusieurs fois),
question : - Un code contenant un UB est il illegal ou seulement
dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale"
bien sur. Autrement dit, est-ce qu'un code contenant un UB est du C
dangeureux ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Bref, sans revenir sur le sujet initial (avec tous ces gens qui
reviennent de vacances ce vieux thread a ete rechauffe plusieurs fois),
question : - Un code contenant un UB est il illegal ou seulement
dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale"
bien sur. Autrement dit, est-ce qu'un code contenant un UB est du C
dangeureux ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Bref, sans revenir sur le sujet initial (avec tous ces gens qui
reviennent de vacances ce vieux thread a ete rechauffe plusieurs fois),
question : - Un code contenant un UB est il illegal ou seulement
dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale"
bien sur. Autrement dit, est-ce qu'un code contenant un UB est du C
dangeureux ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Personne n'a dit qu'un UB était interdit par la norme. Il n'est pas interdit
d'écrire un UB, (sinon, ce ne serait pas un UB), mais il faut simplement être
conscient que la norme de définit pas tout, et que certaines syntaxes, bien
que légales, invoquent un UB. Se fier à la seule validité syntaxique ne
suffit pas à garantir que le code soit correct.
Si personne ne l'a dit, il n'y a pas de discussion. Mais c'est bien parce
que ca a ete dit que ce thread dure si longtemps. Et que je cherche,
sincerement a savoir si c'est illegal ou non. Et ta reponse confirme
parfaitement ce qui etait ma pensee initiale, mais contedit ce dont
j'avais fini par etre convaincu par les interventions successives.
A savoir que tu dis que :Encore une fois, un UB ne rend pas le code illegal, mais simplement
dangereux. On a le droit d'utiliser gets(), mais un professionel sérieux ne
le fera pas.
C'est precisement ce que j'ai cherche a defendre; bien que j'ai fini par
me laisser convaincre du contraire, et a me replier sur une position
plus en retrait ("meme si mon code est illegal, le fait qu'il compile
prouve normalement qu'il est syntaxiquement legal").
Et maintenant j'ai a nouveau un doute.
Bref, sans revenir sur le sujet initial (avec tous ces gens qui reviennent de
vacances ce vieux thread a ete rechauffe plusieurs fois), question :
- Un code contenant un UB est il illegal ou seulement dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale" bien sur.
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
[quand meme autre remarque au passage : mon code avait-il l'air
professionnel ? Bien entendu qu'un professionnel ne fait pas ca. C'etait
sense etre clair].
Hehehe, a moins que tu ne veuilles eclaircir la commutativite de
C'est précisément par ce que ça /peut/provoquer un segfault, que l'on parle
de UB. Il y a des systèmes qui accèptent ça sans rien dire, c'est pour ça
qu'un UB est si dangereux.
On est bien d'accord. Et dans mon tout premier post je disais deja que
c'etait un UB (sans utiliser ces 2 lettres certes, mais quand je disais
que ca compile mais qu'apres ca n'est pas garanti de marcher, c'est
ce que j'expliquais, "avec mes mots a moi").
Oui. Cela dit, il est quand meme important, AMHA, de bien indiquer quand
Personne n'a dit qu'un UB était interdit par la norme. Il n'est pas interdit
d'écrire un UB, (sinon, ce ne serait pas un UB), mais il faut simplement être
conscient que la norme de définit pas tout, et que certaines syntaxes, bien
que légales, invoquent un UB. Se fier à la seule validité syntaxique ne
suffit pas à garantir que le code soit correct.
Si personne ne l'a dit, il n'y a pas de discussion. Mais c'est bien parce
que ca a ete dit que ce thread dure si longtemps. Et que je cherche,
sincerement a savoir si c'est illegal ou non. Et ta reponse confirme
parfaitement ce qui etait ma pensee initiale, mais contedit ce dont
j'avais fini par etre convaincu par les interventions successives.
A savoir que tu dis que :
Encore une fois, un UB ne rend pas le code illegal, mais simplement
dangereux. On a le droit d'utiliser gets(), mais un professionel sérieux ne
le fera pas.
C'est precisement ce que j'ai cherche a defendre; bien que j'ai fini par
me laisser convaincre du contraire, et a me replier sur une position
plus en retrait ("meme si mon code est illegal, le fait qu'il compile
prouve normalement qu'il est syntaxiquement legal").
Et maintenant j'ai a nouveau un doute.
Bref, sans revenir sur le sujet initial (avec tous ces gens qui reviennent de
vacances ce vieux thread a ete rechauffe plusieurs fois), question :
- Un code contenant un UB est il illegal ou seulement dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale" bien sur.
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
[quand meme autre remarque au passage : mon code avait-il l'air
professionnel ? Bien entendu qu'un professionnel ne fait pas ca. C'etait
sense etre clair].
Hehehe, a moins que tu ne veuilles eclaircir la commutativite de
C'est précisément par ce que ça /peut/provoquer un segfault, que l'on parle
de UB. Il y a des systèmes qui accèptent ça sans rien dire, c'est pour ça
qu'un UB est si dangereux.
On est bien d'accord. Et dans mon tout premier post je disais deja que
c'etait un UB (sans utiliser ces 2 lettres certes, mais quand je disais
que ca compile mais qu'apres ca n'est pas garanti de marcher, c'est
ce que j'expliquais, "avec mes mots a moi").
Oui. Cela dit, il est quand meme important, AMHA, de bien indiquer quand
Personne n'a dit qu'un UB était interdit par la norme. Il n'est pas interdit
d'écrire un UB, (sinon, ce ne serait pas un UB), mais il faut simplement être
conscient que la norme de définit pas tout, et que certaines syntaxes, bien
que légales, invoquent un UB. Se fier à la seule validité syntaxique ne
suffit pas à garantir que le code soit correct.
Si personne ne l'a dit, il n'y a pas de discussion. Mais c'est bien parce
que ca a ete dit que ce thread dure si longtemps. Et que je cherche,
sincerement a savoir si c'est illegal ou non. Et ta reponse confirme
parfaitement ce qui etait ma pensee initiale, mais contedit ce dont
j'avais fini par etre convaincu par les interventions successives.
A savoir que tu dis que :Encore une fois, un UB ne rend pas le code illegal, mais simplement
dangereux. On a le droit d'utiliser gets(), mais un professionel sérieux ne
le fera pas.
C'est precisement ce que j'ai cherche a defendre; bien que j'ai fini par
me laisser convaincre du contraire, et a me replier sur une position
plus en retrait ("meme si mon code est illegal, le fait qu'il compile
prouve normalement qu'il est syntaxiquement legal").
Et maintenant j'ai a nouveau un doute.
Bref, sans revenir sur le sujet initial (avec tous ces gens qui reviennent de
vacances ce vieux thread a ete rechauffe plusieurs fois), question :
- Un code contenant un UB est il illegal ou seulement dangeureux ?
Par illegal je n'entends pas "passible de la cour martiale" bien sur.
Autrement dit, est-ce qu'un code contenant un UB est du C dangeureux
ou n'est pas du C.
1[0] = 0, ca n'est pas du C. ok ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
[quand meme autre remarque au passage : mon code avait-il l'air
professionnel ? Bien entendu qu'un professionnel ne fait pas ca. C'etait
sense etre clair].
Hehehe, a moins que tu ne veuilles eclaircir la commutativite de
C'est précisément par ce que ça /peut/provoquer un segfault, que l'on parle
de UB. Il y a des systèmes qui accèptent ça sans rien dire, c'est pour ça
qu'un UB est si dangereux.
On est bien d'accord. Et dans mon tout premier post je disais deja que
c'etait un UB (sans utiliser ces 2 lettres certes, mais quand je disais
que ca compile mais qu'apres ca n'est pas garanti de marcher, c'est
ce que j'expliquais, "avec mes mots a moi").
Oui. Cela dit, il est quand meme important, AMHA, de bien indiquer quand