Exemples de code violant des normes - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs est disponible ici.

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 (Une norme, du latin norma (« équerre, règle ») désigne un...) 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 (Un compilateur est un programme informatique qui traduit un langage, le langage source, en un...) et l'environnement (L'environnement est tout ce qui nous entoure. C'est l'ensemble des éléments naturels et...) 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 
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.

Page générée en 0.022 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales | Partenaire: HD-Numérique
Version anglaise | Version allemande | Version espagnole | Version portugaise