Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Y a-t-il des lacunes dans la norme ISO C90 ?

61 réponses
Avatar
Fabrice
Bonjour,

Un collègue m'a posé une question à laquelle je fus incapable de
répondre : si on suit strictement la norme ISO C90 est-on garanti
d'avoir un programme portable partout ?

Par 'portable partout' j'entends que le programme compilé par n'importe
quel compilateur (respectant la norme) sur n'importe quelle architecture
donne le même résultat (aux erreurs de précision numérique et aux bugs
du compilateur près).

La véritable question est en fait de savoir si la norme est suffisante
ou bien s'il y a des lacunes dedans pour garantir qu'un programme sera
portable.

Si la norme ne suffit pas, pourriez-vous m'indiquer un sous-ensemble de
la norme pouvant garantir la portabilité ?

Merci d'avance !

1 réponse

3 4 5 6 7
Avatar
Vincent Lefevre
Dans l'article <c636m7$r76$,
Antoine Leca écrit:

Juste pour savoir... En admettant ton interprétation, est-ce que le
programme suivant est strictement conforme?

#include <stdio.h>
int main(void)
{
printf ("%dn", INT_MAX == 32767 ? INT_MAX : 32767);
return 0;
}


En supposant bien sûr que tu #inclus <limits.h>,


Oui, évidemment.

à mon sens, oui : il
produit toujours "32767n", donc peut être réduit à
int main() { puts("32767"); return 0;}
C'est juste une variante de HelloWorld.c, et l'idée c'est bien que ce
programme-là, au moins, soit strictement conforme. Je sers du fait que c'est
le résultat qui compte, pas la manière d'y arriver. Donc pour reprendre ton
exemple,

#include <stdio.h>
#include <limits.h>
int main(void) {
int c = 'a';
char s[CHAR_BIT/3 + 17];
sprintf(s, "Code de '%c' = %dn", c, c);
return 0;
}

est, à mon sens, strictement conforme. Y compris si on rajoute un appel à
setlocale(LC_CTYPE, "");.


D'accord, puisqu'on ne sort rien.

[ En fait, il ne l'est pas, parce que, théoriquement, CHAR_BIT peut être
très grand, et alors soit s va passer la limite de 32767/65535, soit le %d
va dépasser la limite de 509/4095. Mais bon. ]


Pas regardé en détail, mais je vois ce que tu veux dire.

Mais pourtant ces codes binaires auront une interprétation différente
suivant les implémentation. Donc pourquoi serait-ce strictement
conforme?


Justement, c'est là le point: si tu interprètes les codes binaires,
tu sors de la conformité stricte.


C'est justement mon point de vue. L'utilisateur peut *toujours*
interpréter les codes binaires, même si ce n'est pas la volonté
du programmeur. Le fait est que ça dépend de l'implémentation.

[...]
Parce que avec ton programme, une machine ASCII va donner
Code de 'a' = 97<NL>
Et une machine EBCDIC
Code de 'a' = 129<NL>
Ce qui n'est pas la même chose, donc le programme n'a pas le même effet sur
deux machines différentes, donc il n'est pas portable au sens où l'effet du
programme doit être identique.


Et pourtant, le programme sort la même information que si on
envoyait 'a' en sortie: l'utilisateur peut très bien regarder
le code binaire de 'a' derrière.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% validated (X)HTML - Acorn / RISC OS / ARM, free software, YP17,
Championnat International des Jeux Mathématiques et Logiques, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


3 4 5 6 7