Bases de la programmation en C

Quelle description du comportement indéfini, au sens de la norme du langage C, est correcte ?

  1. AUn comportement sur lequel la norme n'impose rien ; le compilateur peut optimiser en supposant qu'il ne se produit jamais, et le résultat peut être inattendu
  2. BUn comportement dont chaque implémentation fixe le résultat, avec l'obligation de le documenter
  3. CUn comportement toujours détecté à l'exécution, qui affiche un message d'erreur et arrête le programme
Afficher la réponse et l'explication

Réponse : A. Un comportement sur lequel la norme n'impose rien ; le compilateur peut optimiser en supposant qu'il ne se produit jamais, et le résultat peut être inattendu

Un comportement indéfini est un comportement sur lequel la norme n'impose aucune exigence, comme le dépassement de capacité d'un entier signé, l'accès hors des bornes d'un tableau, le déréférencement d'un pointeur NULL ou l'utilisation après libération. Il peut arriver qu'il fonctionne comme prévu, mais comme le compilateur peut optimiser en supposant qu'il « ne se produit pas dans un programme correct », il suffit de changer les options d'optimisation ou la version du compilateur pour que le résultat change. En revanche, ce que l'implémentation choisit et doit documenter, comme la taille d'un int ou le fait que char soit signé ou non, s'appelle un comportement défini par l'implémentation. Avec gcc et clang, l'option -fsanitize=undefined détecte une partie des comportements indéfinis à l'exécution.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. int et unsigned int font 32 bits. Laquelle des opérations suivantes est un comportement indéfini selon la norme du langage C ?
  2. Lorsque la fonction ci-dessus est compilée avec gcc en activant l'optimisation, le test if (p == NULL) peut être supprimé. Quelle en est la raison ?
  3. Que fixe la norme du langage C au sujet de la taille du type int ?
  4. Dans les programmes embarqués, une variable qui reçoit la valeur d'un registre de périphérique de 32 bits est souvent déclarée avec le type uint32_t de stdint.h plutôt qu'avec unsigned int. Quelle en est la raison principale ?
  5. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui contient une division entre entiers ?