- Exemples de code violant des normes
-
Le respect des normes de programmation est une contrainte dans les langages informatiques. Certains programmes ne respectant pas ces normes peuvent avoir un comportement correct parfois mais incorrect dans d'autres cas.
Si on considère le cas du C la norme spécifie deux types de comportements suivant les violations envisagées :
- comportement non spécifié : La norme décrit les comportements possibles sans spécifier lequel sera utilisé (unspecified behavior en anglais).
- comportement indéterminé : aucune spécification, le compilateur et l'environnement d'exécution sont libres d'imposer un comportement y compris d'avoir un comportement aléatoire (undefined behavior en anglais).
Utiliser un comportement non spécifié dans un programme est possible si :
- La mise en œuvre de la norme spécifie dans sa documentation quel comportement sera utilisé.
- l'auteur du programme décide qu'il ne sera utilisé qu'avec cette mise en œuvre précise de la norme.
Évidemment dans ce cas le programme considéré ne sera pas portable dans d'autres environnements.
Code ayant un comportement non spécifié en C
#include <stdio.h> int main(void) { int a = 0; printf("%d %d\n", a, ++a); return 0; }
L'ordre d'évaluation des paramètres lors d'un appel de fonction n'est pas spécifié dans la norme décrivant le langage C, aussi le compilateur peut évaluer ce fragment de code de plusieurs façons différentes. Par exemple :
int j = a; int k = j + 1; printf("%d %d\n", j, k);
affichera :
0 1
ou bien :
int j = a + 1; int k = j; printf("%d %d\n", j, k);
affichera :
1 1
Code ayant un comportement indéterminé en C
int main(void) { double a; double * pa = &a; float * c; c = (float *)pa; return 0; }
La conversion entre deux pointeurs vers des types qui possèdent des conditions d'alignements potentiellement différents produit un résultat indéterminé en C.
Wikimedia Foundation. 2010.