Qu’est-ce qu’un comportement indéfini en C?

Quel est le comportement indéfini en C?

J’utilise le compilateur GCC. Dans certains cas, j’obtiens une valeur correcte même si la sortie du programme était supposée être indéfinie. J’ai couru ces programmes plusieurs fois. Mais le résultat était cohérent. Et pour certains autres programmes, le résultat était indéfini. Dans quels cas devrais-je considérer que le comportement du programme est vraiment indéfini? Existe-t-il des règles pour cela?

La définition du comportement non défini:

C11 (ISO / IEC 9899: 201x) §3.4.3

1 comportement non défini

comportement, lors de l’utilisation d’une construction de programme non portable ou erronée ou de données erronées, pour lequel la présente Norme internationale n’impose aucune exigence

2 NOTE Le comportement indéfini possible va d’ignorer complètement la situation avec des résultats imprévisibles, de se comporter pendant la traduction ou l’exécution du programme de manière documentée, caractéristique de l’environnement (avec ou sans émission d’un message de diagnostic), jusqu’à la fin de la traduction ou de l’exécution (avec l’émission d’un message de diagnostic).

3 EXEMPLE Un exemple de comportement non défini est le comportement en cas de dépassement d’entier.

Il existe également une liste de comportements non définis dans C11 §J.2 Comportement non défini

Je pense que, en termes simples, si le comportement de l’instruction n’est pas garanti comme étant cohérent pour tous les compilateurs ou toutes les situations, vous pouvez le définir comme un comportement non défini.

Comportement, lors de l’utilisation d’une construction de programme non portable ou erronée, de données erronées ou d’objects à valeur indéterminée, pour lequel la présente Norme internationale n’impose aucune exigence.

Exemple:

i = ++i; 

Pour plus vous pouvez lire ceci .

comportement indéfini signifie que le compilateur peut émettre le code de son choix. Votre programme peut afficher les résultats attendus, formater votre disque dur ou commencer à envoyer des courriels aux talibans. tout peut arriver

Ceci peut être illustré par un exemple,

 #include "stdio.h" int *ptr; void func2() { int k = 300; } void func1() { int t = 100; ptr = &t; } int main(int argc, char *argv) { func1(); printf("The value of t=%d\r\n",*ptr); func2(); printf("The value of t=%d\r\n",*ptr); } On my machine, I got the following. joshis1@(none) temp]$ ./ud.out The value of t=100 The value of t=300 

Cela indique que la valeur de t n’était pas garantie. Une fois la scope de t terminée, l’espace de stack a été alloué à k. Ainsi, ptr accédait à la même adresse – emplacement mémoire. Mais la scope variable était terminée. Vous obtiendrez un résultat cohérent si vous n’appelez pas func2 (); Ainsi, le compilateur ne garantit pas le résultat -> Cela s’appelle le comportement indéfini.