C++Comportement non défini


Introduction

Qu'est-ce qu'un comportement indéfini (UB)? Selon la norme ISO C ++ (§1.3.24, N4296), c'est "le comportement pour lequel la présente Norme internationale n'impose aucune exigence".

Cela signifie que lorsqu'un programme rencontre UB, il est autorisé à faire ce qu'il veut. Cela signifie souvent un accident, mais il peut simplement ne rien faire , faire en sorte que les démons ne vous touchent pas ou même sembler fonctionner correctement!

Inutile de dire que vous devriez éviter d'écrire du code qui appelle UB.

Remarques

Si un programme contient un comportement indéfini, le standard C ++ ne place aucune contrainte sur son comportement.

  • Il peut sembler fonctionner comme prévu par le développeur, mais il peut également tomber en panne ou produire des résultats étranges.
  • Le comportement peut varier entre les exécutions du même programme.
  • Toute partie du programme peut ne pas fonctionner correctement, y compris les lignes précédant la ligne contenant un comportement indéfini.
  • L'implémentation n'est pas requise pour documenter le résultat d'un comportement non défini.

Une implémentation peut documenter le résultat d'une opération qui produit un comportement indéfini conformément à la norme, mais un programme qui dépend de ce comportement documenté n'est pas portable.

Pourquoi un comportement indéfini existe

Intuitivement, le comportement non défini est considéré comme une mauvaise chose, car de telles erreurs ne peuvent être traitées gracieusement, par exemple, par des gestionnaires d'exceptions.

Mais laisser un comportement indéfini fait en réalité partie intégrante de la promesse de C ++: "vous ne payez pas pour ce que vous n'utilisez pas". Un comportement indéfini permet à un compilateur de supposer que le développeur sait ce qu'il fait et n'introduit pas de code pour vérifier les erreurs mises en évidence dans les exemples ci-dessus.

Trouver et éviter un comportement indéfini

Certains outils peuvent être utilisés pour découvrir un comportement indéfini pendant le développement:

  • La plupart des compilateurs ont des drapeaux d'avertissement pour avertir de certains cas de comportement indéfini au moment de la compilation.
  • Les versions plus récentes de gcc et de clang incluent un indicateur appelé "Désinfectant de comportement -fsanitize=undefined " ( -fsanitize=undefined ) qui vérifie le comportement indéfini à l'exécution, à un coût de performance.
  • lint outils ressemblant à des lint peuvent effectuer une analyse comportementale non définie plus approfondie.

Comportement non défini , non spécifié et défini par l'implémentation

De la norme C ++ 14 (ISO / IEC 14882: 2014), section 1.9 (Exécution du programme):

  1. Les descriptions sémantiques de la présente Norme internationale définissent une machine abstraite non déterministe paramétrée. [COUPER]

  2. Certains aspects et opérations de la machine abstraite sont décrits dans la présente Norme internationale comme définis par la mise en œuvre (par exemple, sizeof(int) ). Celles-ci constituent les paramètres de la machine abstraite . Chaque mise en œuvre doit inclure une documentation décrivant ses caractéristiques et son comportement à ces égards. [COUPER]

  3. Certains autres aspects et opérations de la machine abstraite sont décrits dans la présente Norme internationale comme non spécifiés (par exemple, évaluation des expressions dans un nouvel initialiseur si la fonction d'allocation ne parvient pas à allouer de la mémoire). Dans la mesure du possible, la présente Norme internationale définit un ensemble de comportements admissibles. Celles-ci définissent les aspects non déterministes de la machine abstraite. Une instance de la machine abstraite peut donc avoir plus d'une exécution possible pour un programme donné et une entrée donnée.

  4. Certaines autres opérations sont décrites dans la présente Norme internationale comme non définies (ou exemple, l'effet de la tentative de modification d'un objet const ). [ Note : la présente Norme internationale n'impose aucune exigence concernant le comportement des programmes qui contiennent un comportement indéfini. - note finale ]

Comportement non défini Exemples Liés