Quels sont tous les comportements non définis communs qu'un programmeur C ++ devrait connaître?
Dites, comme:
a[i] = i++;
c++
undefined
undefined-behavior
c++-faq
yesraaj
la source
la source
Réponses:
Aiguille
NULL
pointeurmemcpy
pour copier des tampons qui se chevauchent .Débordements de tampon
Débordements entiers
int64_t i = 1; i <<= 72
n'est pas défini)Types, distribution et const
int i; i++; cout << i;
)volatile
ousig_atomic_t
à la réception d'un signalFonction et modèle
OOP
Fichier source et prétraitement
long int
#if
expressionÊtre classé
la source
L'ordre dans lequel les paramètres de fonction sont évalués est un comportement non spécifié . (Cela ne fera pas planter votre programme, exploser ou commander une pizza ... contrairement au comportement non défini .)
La seule exigence est que tous les paramètres doivent être entièrement évalués avant l'appel de la fonction.
Ce:
Peut être équivalent à ceci:
Ou ca:
Cela peut être soit; c'est au compilateur. Le résultat peut être important, selon les effets secondaires.
la source
Le compilateur est libre de réorganiser les parties d'évaluation d'une expression (en supposant que la signification est inchangée).
De la question d'origine:
Verrouillage à double contrôle. Et une simple erreur à commettre.
la source
Mon préféré est "Récursion infinie dans l'instanciation des modèles" car je crois que c'est le seul où le comportement indéfini se produit au moment de la compilation.
la source
Affectation à une constante après dénudage en
const
utilisantconst_cast<>
:la source
Outre le comportement non défini , il existe également un comportement défini par l' implémentation tout aussi désagréable .
Un comportement non défini se produit lorsqu'un programme fait quelque chose dont le résultat n'est pas spécifié par la norme.
Le comportement défini par l'implémentation est une action d'un programme dont le résultat n'est pas défini par la norme, mais que l'implémentation doit documenter. Un exemple est "Littéraux de caractères multi-octets", de la question Stack Overflow Y a-t-il un compilateur C qui ne parvient pas à le compiler? .
Le comportement défini par l'implémentation ne vous mord que lorsque vous démarrez le portage (mais la mise à niveau vers une nouvelle version du compilateur est également un portage!)
la source
Les variables ne peuvent être mises à jour qu'une seule fois dans une expression (techniquement une fois entre des points de séquence).
la source
Une compréhension de base des différentes limites environnementales. La liste complète se trouve à la section 5.2.4.1 de la spécification C. Voici quelques-uns;
J'étais en fait un peu surpris de la limite de 1023 étiquettes de cas pour une instruction switch, je peux prévoir que le dépassement pour le code / lex / analyseurs généré assez facilement.
Si ces limites sont dépassées, vous avez un comportement indéfini (plantages, failles de sécurité, etc ...).
Bon, je sais que cela vient de la spécification C, mais C ++ partage ces supports de base.
la source
Permet
memcpy
de copier entre des régions de mémoire qui se chevauchent. Par exemple:Le comportement n'est pas défini selon la norme C, qui est subsumée par la norme C ++ 03.
7.21.2.1 La fonction memcpy
7.21.2.2 La fonction memmove
la source
Le seul type pour lequel C ++ garantit une taille est
char
. Et la taille est 1. La taille de tous les autres types dépend de la plate-forme.la source
Les objets de niveau espace de noms dans des unités de compilation différentes ne doivent jamais dépendre les uns des autres pour l'initialisation, car leur ordre d'initialisation n'est pas défini.
la source