Namespaces
Variants

Analyzability (since C11)

From cppreference.net

Cette extension facultative du langage C limite les résultats potentiels de l'exécution de certaines formes de comportement indéfini, ce qui améliore l'efficacité de l'analyse statique de tels programmes. L'analysabilité n'est garantie d'être activée que si la constante macro prédéfinie __STDC_ANALYZABLE__ est définie par le compilateur.

Si le compilateur prend en charge l'analysabilité, toute construction de langage ou de bibliothèque dont le comportement est indéfini est en outre classifiée entre comportement indéfini critique et comportement indéfini borné , et le comportement de tous les cas de comportement indéfini borné est limité comme spécifié ci-dessous.

Table des matières

Comportement indéfini critique

L'UB critique est un comportement indéfini qui pourrait effectuer une écriture en mémoire ou une lecture volatile en mémoire en dehors des limites de tout objet. Un programme présentant un comportement indéfini critique peut être vulnérable à des exploitations de sécurité.

Seuls les comportements indéfinis suivants sont critiques :

  • accès à un objet en dehors de sa durée de vie (par exemple via un pointeur pendouillant)
  • écriture dans un objet dont les déclarations ne sont pas compatibles
  • appel de fonction via un pointeur de fonction dont le type n'est pas compatible avec le type de la fonction pointée
  • expression lvalue évaluée, mais ne désignant pas d'objet
  • tentative de modification d'un littéral de chaîne
  • déréférencement d'un pointeur invalide (nul, indéterminé, etc.) ou au-delà de la fin
  • modification d'un objet const via un pointeur non-const
  • appel à une fonction ou macro de bibliothèque standard avec un argument invalide
  • appel à une fonction variadique de bibliothèque standard avec un type d'argument inattendu (par exemple appel à printf avec un argument dont le type ne correspond pas à son spécificateur de conversion)
  • longjmp lorsqu'il n'y a pas de setjmp dans la portée d'appel, entre threads, ou depuis la portée d'un type VM.
  • toute utilisation du pointeur libéré par free ou realloc
  • toute fonction de bibliothèque de chaîne ou chaîne large accède à un tableau hors limites

Comportement indéfini borné

L'UB borné est un comportement indéfini qui ne peut pas effectuer une écriture mémoire illégale, bien qu'il puisse piéger et peut produire ou stocker des valeurs indéterminées.

  • Tout comportement non défini non listé comme critique est borné, y compris

Notes

Le comportement indéfini borné désactive certaines optimisations : la compilation avec l'analysabilité activée préserve la causalité du code source, qui pourrait être violée par un comportement indéfini autrement.

L'extension d'analysabilité permet, comme forme de comportement défini par l'implémentation, que le gestionnaire de contraintes d'exécution soit invoqué lorsqu'un trap se produit.

Références

  • Norme C23 (ISO/IEC 9899:2024):
  • 6.10.10.4/1 Macros de fonctionnalités conditionnelles (p: 188-189)
  • Annexe L Analysabilité (p: 672-673)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 6.10.8.3/1 Macros de fonctionnalités conditionnelles (p: 128-129)
  • Annexe L Analysabilité (p: 473-474)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.10.8.3/1 Macros de fonctionnalités conditionnelles (p: 177)
  • Annexe L Analysabilité (p: 652-653)