C Language
Comportement défini par la mise en œuvre
Recherche…
Remarques
Vue d'ensemble
Le standard C décrit la syntaxe du langage, les fonctions fournies par la bibliothèque standard et le comportement des processeurs C conformes (en gros, les compilateurs) et des programmes C conformes. En ce qui concerne le comportement, la norme spécifie pour la plupart des comportements particuliers pour les programmes et les processeurs. D'un autre côté, certaines opérations ont un comportement non défini, explicite ou implicite - de telles opérations doivent toujours être évitées, car vous ne pouvez pas vous fier à elles. Entre les deux, il y a une variété de comportements définis par l'implémentation . Ces comportements peuvent varier entre les processeurs C, les runtimes et les bibliothèques standard (collectivement, les implémentations ), mais ils sont cohérents et fiables pour toute implémentation donnée, et les implémentations conformes documentent leur comportement dans chacun de ces domaines.
Il est parfois raisonnable qu'un programme repose sur un comportement défini par l'implémentation. Par exemple, si le programme est de toute façon spécifique à un environnement d'exploitation particulier, il est peu probable que le recours à des comportements définis par l'implémentation pour les processeurs communs pour cet environnement pose problème. Alternativement, on peut utiliser des directives de compilation conditionnelle pour sélectionner les comportements définis par l'implémentation appropriés pour l'implémentation utilisée. Dans tous les cas, il est essentiel de savoir quelles opérations ont un comportement défini pour la mise en œuvre, de manière à les éviter ou à prendre une décision éclairée quant à savoir si et comment les utiliser.
Le reste de ces remarques constitue une liste de tous les comportements et caractéristiques définis dans la norme C2011, avec des références à la norme. Beaucoup d'entre eux utilisent la terminologie de la norme . Certains autres s'appuient plus généralement sur le contexte de la norme, comme les huit étapes de la traduction du code source dans un programme, ou la différence entre les implémentations hébergées et autonomes. Certains, particulièrement surprenants ou remarquables, sont présentés en caractères gras. Tous les comportements décrits ne sont pas pris en charge par les normes C antérieures, mais ils ont généralement un comportement défini par la mise en œuvre dans toutes les versions de la norme qui les prennent en charge.
Programmes et processeurs
Général
Le nombre de bits dans un octet ( 3.6 / 3 ). Au moins
8
, la valeur réelle peut être interrogée avec la macroCHAR_BIT
.Quels messages de sortie sont considérés comme des "messages de diagnostic" ( 3.10 / 1 )
Traduction source
La manière dont les caractères multi-octets du fichier source physique sont associés au jeu de caractères source ( 5.1.1.2/1 ).
Si les séquences non vides d'espaces blancs non newline sont remplacées par des espaces simples pendant la phase de traduction 3 ( 5.1.1.2/1 )
Les caractères de l'ensemble d'exécution auxquels les caractères littéraux et les caractères des constantes de chaîne sont convertis (pendant la phase de traduction 5) lorsqu'il n'y a pas d'autre caractère correspondant ( 5.1.1.2/1 ).
Environnement d'exploitation
La manière dont les messages de diagnostic à émettre sont identifiés ( 5.1.1.3/1 ).
Le nom et le type de la fonction appelée au démarrage dans une implémentation autonome ( 5.1.2.1/1 ).
Quelles bibliothèques sont disponibles dans une implémentation autonome, au-delà d’un ensemble minimal spécifié ( 5.1.2.1/1 ).
L'effet de la fin du programme dans un environnement autonome ( 5.1.2.1/2 ).
Dans un environnement hébergé, toute signature autorisée pour la fonction
main()
autre queint main(int argc, char *arg[])
etint main(void)
( 5.1.2.2.1 / 1 ).La manière dont une implémentation hébergée définit les chaînes pointées par le second argument de
main()
( 5.1.2.2.1 / 2 ).Ce qui constitue un "dispositif interactif" aux fins des sections 5.1.2.3 (Exécution du programme) et 7.21.3 (Fichiers) ( 5.1.2.3/7 ).
Toute restriction sur les objets auxquels les routines d'interruption de traitement font référence dans une implémentation optimisée ( 5.1.2.3/10 ).
Dans une implémentation autonome, si plusieurs threads d'exécution sont pris en charge ( 5.1.2.4/1 ).
Les valeurs des membres du jeu de caractères d'exécution ( 5.2.1 / 1 ).
Les
char
valeurs correspondant aux séquences d'échappement alphabétiques définies ( 5.2.2 / 3 ).Les limites et caractéristiques numériques entières et à virgule flottante ( 5.2.4.2/1 ).
La précision des opérations arithmétiques à virgule flottante et des conversions de la bibliothèque standard à partir de représentations internes en virgule flottante en représentations de chaînes ( 5.2.4.2.2 / 6 ).
La valeur de la macro
FLT_ROUNDS
, qui code le mode d'arrondi à virgule flottante par défaut ( 5.2.4.2.2 / 8 ).Les comportements d'arrondi caractérisés par des valeurs de
FLT_ROUNDS
supérieures à 3 ou inférieures à -1 ( 5.2.4.2.2 / 8 ).La valeur de la macro
FLT_EVAL_METHOD
, qui caractérise le comportement d'évaluation en virgule flottante ( 5.2.4.2.2 / 9 ).Comportement caractérisé par des valeurs de
FLT_EVAL_METHOD
inférieures à -1 ( 5.2.4.2.2 / 9 ).Les valeurs des macros
FLT_HAS_SUBNORM
,DBL_HAS_SUBNORM
etLDBL_HAS_SUBNORM
, caractérisant si les formats à virgule flottante standard prennent en charge les nombres inférieurs à la normale ( 5.2.4.2.2 / 10 )
Les types
Le résultat de la tentative d'accès (indirectement) à un objet avec une durée de stockage de thread à partir d'un thread autre que celui avec lequel l'objet est associé ( 6.2.4 / 4 )
La valeur d'une
char
dans laquelle un caractère à l'extérieur de l'ensemble d'exécution de base a été affectée ( 6.2.5 / 3 ).Les types entiers signés étendus pris en charge, le cas échéant ( 6.2.5 / 4 ), et tous les mots clés d'extension utilisés pour les identifier.
Si
char
a la même représentation et le même comportement que le caractèresigned char
ou le caractèreunsigned char
( 6.2.5 / 15 ). Peut être interrogé avecCHAR_MIN
, qui est soit0
ouSCHAR_MIN
sichar
est non signé ou signé, respectivement.Le nombre, l'ordre et le codage des octets dans les représentations des objets , sauf si explicitement spécifié par la norme ( 6.2.6.1/2 ).
Laquelle des trois formes de représentation entière reconnues s'applique dans une situation donnée, et si certains modèles de bits des objets entiers sont des représentations de pièges ( 6.2.6.2/2 ).
L'exigence d'alignement de chaque type ( 6.2.8 / 1 ).
Si et dans quels contextes, tous les alignements étendus sont pris en charge ( 6.2.8 / 3 ).
L'ensemble des alignements étendus pris en charge ( 6.2.8 / 4 ).
Les nombres de conversion entiers de tous les types entiers signés étendus les uns par rapport aux autres ( 6.3.1.1/1 ).
L'affectation d'une valeur hors plage à un entier signé ( 6.3.1.3/3 ).
Lorsqu'une valeur à portée mais non représentable est attribuée à un objet à virgule flottante, comment la valeur représentable stockée dans l'objet est choisie parmi les deux valeurs représentables les plus proches ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).
Le résultat de la conversion d'un entier en un type de pointeur , à l'exception des expressions constantes entières avec la valeur
0
( 6.3.2.3/5 ).
Formulaire source
Les emplacements dans les directives
#pragma
où les jetons de nom d'en-tête sont reconnus ( 6.4 / 4 ).Les caractères, y compris les caractères multi-octets autres que le soulignement, les lettres latines non accentuées, les noms de caractères universels et les chiffres décimaux pouvant apparaître dans les identificateurs ( 6.4.2.1/1 ).
Le nombre de caractères significatifs dans un identifiant ( 6.4.2.1/5 ).
À quelques exceptions près, la manière dont les caractères source d'une constante de caractère entier sont mappés sur des caractères d'ensemble d'exécution ( 6.4.4.4/2 ; 6.4.4.4/10 ).
Paramètres régionaux courants utilisés pour calculer la valeur d'une constante de caractère large et la plupart des autres aspects de la conversion de nombreuses constantes de ce type ( 6.4.4.4/11 ).
Si les jetons littéraux à chaînes larges préfixés différemment peuvent être concaténés et, si tel est le cas, le traitement de la séquence de caractères multi-octets résultante ( 6.4.5 / 5 )
Les paramètres régionaux utilisés lors de la phase de traduction 7 pour convertir les chaînes de caractères larges en séquences de caractères multi-octets, et leur valeur lorsque le résultat n'est pas représentable dans le jeu de caractères d'exécution ( 6.4.5 / 6 ).
La manière dont les noms d'en-tête sont mappés aux noms de fichiers ( 6.4.7 / 2 ).
Évaluation
FP_CONTRACT
si et comment les expressions à virgule flottante sont contractées lorsqueFP_CONTRACT
n'est pas utilisé ( 6.5 / 8 ).Les valeurs des résultats des opérateurs
sizeof
et_Alignof
( 6.5.3.4/5 ).La taille du type de résultat de la soustraction de pointeur ( 6.5.6 / 9 ).
Le résultat du décalage à droite d'un entier signé avec une valeur négative ( 6.5.7 / 5 ).
Comportement d'exécution
La mesure dans laquelle le mot-clé de
register
est effectif ( 6.7.1 / 6 ).Si le type d'un champ de bits déclaré comme
int
est le même queunsigned int
ousigned int
( 6.7.2 / 5 ).Quels types de champs de bits peuvent prendre, autres que
_Bool
, facultativement qualifiés,_Bool
signed int
etunsigned int
; si les champs de bits peuvent avoir des types atomiques ( 6.7.2.1/5 ).Aspects de la manière dont les implémentations organisent le stockage pour les champs de bits ( 6.7.2.1/11 ).
L'alignement des membres non bitfield des structures et des unions ( 6.7.2.1/14 ).
Le type sous-jacent pour chaque type énuméré ( 6.7.2.2/4 ).
Ce qui constitue un "accès" à un objet de type
volatile
qualifié ( 6.7.3 / 7 ).L'efficacité des déclarations de fonctions en
inline
( 6.7.4 / 6 ).
Préprocesseur
Si les constantes de caractères sont converties en valeurs entières de la même manière dans les conditions préprocesseurs que dans les expressions ordinaires, et si une constante à un seul caractère peut avoir une valeur négative ( 6.10.1 / 4 ).
Les emplacements ont recherché les fichiers désignés dans une directive
#include
( 6.10.2 / 2-3 ).La manière dont un nom d'en-tête est formé à partir des jetons d'une directive
#include
multi-token ( 6.10.2 / 4 ).La limite pour l'imbrication
#include
( 6.10.2 / 6 ).Si un caractère
\
est inséré avant le\
introduction d'un nom de caractère universel dans le résultat de l'opérateur#
du préprocesseur ( 6.10.3.2/2 ).Le comportement de la directive de prétraitement
#pragma
pour les pragmas autres queSTDC
( 6.10.6 / 1 ).La valeur des macros
__DATE__
et__TIME__
si aucune date ou heure de traduction, respectivement, n'est disponible ( 6.10.8.1/1 ).Le codage de caractères interne utilisé pour
wchar_t
si la macro__STDC_ISO_10646__
n'est pas définie ( 6.10.8.2/1 ).Le codage de caractères interne utilisé pour
char32_t
si la macro__STDC_UTF_32__
n'est pas défini ( 6.10.8.2/1 ).
Bibliothèque standard
Général
- Le format des messages émis lorsque les assertions échouent ( 7.2.1.1/2 ).
Fonctions d'environnement à virgule flottante
Toutes les exceptions à virgule flottante supplémentaires au-delà de celles définies par la norme ( 7.6 / 6 ).
Tous les modes d'arrondi à virgule flottante supplémentaires au-delà de ceux définis par la norme ( 7.6 / 8 ).
Tout environnement à virgule flottante supplémentaire au-delà de ceux définis par la norme ( 7.6 / 10 ).
La valeur par défaut du commutateur d'accès à l'environnement à virgule flottante ( 7.6.1 / 2 ).
La représentation des indicateurs d'état à virgule flottante enregistrés par
fegetexceptflag()
( 7.6.2.2/1 ).feraiseexcept()
si la fonctionferaiseexcept()
déclenche en plus une exception à virgule flottante "inexacte" à chaque fois qu'elle génère une exception à virgule flottante "overflow" ou " underflow" ( 7.6.2.3/2 ).
Fonctions liées aux paramètres régionaux
- Les chaînes de paramètres régionaux autres que
"C"
supportées parsetlocale()
( 7.11.1.1/3 ).
Fonctions mathématiques
Les types représentés par
float_t
etdouble_t
lorsque la macroFLT_EVAL_METHOD
a une valeur différente de0
,1
et2
( 7.12 / 2 ).Toute classification à virgule flottante prise en charge au-delà de celles définies par la norme ( 7.12 / 6 ).
La valeur renvoyée par le
math.h
fonctionne en cas d'erreur de domaine ( 7.12.1 / 2 ).La valeur renvoyée par le
math.h
fonctionne en cas d'erreur de pôle ( 7.12.1 / 3 ).La valeur renvoyée par le
math.h
fonctionne lorsque le résultat est sous-jacent, et indique sierrno
est défini surERANGE
et si une exception à virgule flottante est déclenchée dans ces circonstances ( 7.12.1 / 6 ).La valeur par défaut du commutateur de contraction FP ( 7.12.2 / 2 ).
Si les fonctions
fmod()
renvoient 0 oufmod()
une erreur de domaine lorsque leur second argument est 0 ( 7.12.10.1/3 ).Si les fonctions
remainder()
renvoient 0 ou génèrent une erreur de domaine lorsque leur second argument est 0 ( 7.12.10.2/3 ).Nombre de bits significatifs dans les modules quotient calculés par les fonctions
remquo()
( 7.12.10.3/2 ).Si les fonctions
remquo()
renvoient 0 ouremquo()
une erreur de domaine lorsque leur second argument est 0 ( 7.12.10.3/3 ).
Les signaux
L'ensemble complet des signaux pris en charge, leur sémantique et leur traitement par défaut ( 7.14 / 4 ).
Lorsqu'un signal est déclenché et qu'un gestionnaire personnalisé est associé à ce signal, quels signaux, le cas échéant, sont bloqués pendant la durée de l'exécution du gestionnaire ( 7.14.1.1/3 ).
Les signaux autres que
SIGFPE
,SIGILL
etSIGSEGV
provoquent un comportement indéfini lors du retour d'un gestionnaire de signal personnalisé ( 7.14.1.1/3 ).Quels signaux sont initialement configurés pour être ignorés (indépendamment de leur traitement par défaut; 7.14.1.1/6 ).
Divers
- La constante de pointeur null spécifique à laquelle la macro
NULL
développe ( 7.19 / 3 ).
Fonctions de traitement de fichiers
Si la dernière ligne d'un flux de texte nécessite une nouvelle ligne de terminaison ( 7.21.2 / 2 ).
Nombre de caractères nuls ajoutés automatiquement à un flux binaire ( 7.21.2 / 3 ).
La position initiale d'un fichier ouvert en mode annexe ( 7.21.3 / 1 ).
Si une écriture sur un flux de texte provoque la troncature du flux ( 7.21.3 / 2 ).
Prise en charge de la mise en mémoire tampon des flux ( 7.21.3 / 3 ).
Indique si des fichiers de longueur nulle existent ( 7.21.3 / 4 ).
Les règles pour composer des noms de fichiers valides ( 7.21.3 / 8 ).
Si le même fichier peut être simultanément ouvert plusieurs fois ( 7.21.3 / 8 ).
La nature et le choix de l'encodage pour les caractères multi-octets ( 7.21.3 / 10 ).
Comportement de la fonction
remove()
lorsque le fichier cible est ouvert ( 7.21.4.1/2 ).Comportement de la fonction
rename()
lorsque le fichier cible existe déjà ( 7.21.4.2/2 ).Si les fichiers créés via la fonction
tmpfile()
sont supprimés dans le cas où le programme se termine anormalement ( 7.21.4.3/2 ).Quel mode change sous quelles circonstances sont autorisées via
freopen()
( 7.21.5.4/3 ).
Fonctions d'E / S
Laquelle des représentations autorisées des valeurs infinies et non-nombre de FP est produite par les fonctions printf () - family ( 7.21.6.1/8 ).
La manière dont les pointeurs sont formatés par la fonction
printf()
( 7.21.6.1/8 ).Le comportement de la famille
scanf()
fonctionne lorsque le caractère-
apparaît dans une position interne de la liste de scrutation d'un[
champ ( 7.21.6.2/12 )).La plupart des aspects de la transmission des fonctions
p
de la famillescanf()
( 7.21.6.2/12 ).La valeur d'
errno
définie parfgetpos()
en cas d'échec ( 7.21.9.1/2 ).La valeur d'
errno
définie parfsetpos()
en cas d'échec ( 7.21.9.3/2 ).La valeur d'
errno
définie parftell()
en cas d'échec ( 7.21.9.4/3 ).La signification des fonctions de famille
strtod()
de certains aspects pris en charge d'un formatage NaN ( 7.22.1.3p4 ).strtod()
si lesstrtod()
la famillestrtod()
placenterrno
surERANGE
lorsque le résultat est sous-développé ( 7.22.1.3/10 ).
Fonctions d'allocation de mémoire
- Le comportement des attributions de mémoire fonctionne lorsque le nombre d'octets requis est 0 ( 7.22.3 / 1 ).
Fonctions d'environnement système
Quels nettoyages sont effectués, le cas échéant, et quel statut est renvoyé au système d'exploitation hôte lorsque la fonction
abort()
est appelée ( 7.22.4.1/2 ).Quel statut est renvoyé à l'environnement hôte lorsque
exit()
est appelé ( 7.22.4.4/5 ).La gestion des flux ouverts et quel statut est renvoyé à l'environnement hôte lorsque
_Exit()
est appelé ( 7.22.4.5/2 ).L'ensemble des noms d'environnement accessibles via
getenv()
et la méthode de modification de l'environnement ( 7.22.4.6/2 ).La valeur de retour de la fonction
system()
( 7.22.4.8/3 ).
Fonctions de date et heure
Le fuseau horaire local et l'heure d'été ( 7.27.1 / 1 ).
La plage et la précision des temps représentables via les types
clock_t
ettime_t
( 7.27.1 / 4 ).Le début de l'ère qui sert de référence pour les temps renvoyés par la fonction
clock()
( 7.27.2.1/3 ).Le début de l'époque qui sert de référence pour les temps renvoyés par la fonction
timespec_get()
(lorsque la base de temps estTIME_UTC
; 7.27.2.5/3 ).Le remplacement
strftime()
du spécificateur de conversion%Z
dans les paramètres régionaux "C" ( 7.27.3.5/7 ).
Fonctions d'E / S à caractères larges
Laquelle des représentations autorisées des valeurs infinies et non-nombre de FP est produite par les
wprintf()
la famillewprintf()
( 7.29.2.1/8 ).La manière dont les pointeurs sont formatés par les
wprintf()
la famillewprintf()
( 7.29.2.1/8 ).Le comportement de la famille
wscanf()
fonctionne lorsque le caractère-
apparaît dans une position interne de la liste de scrutation d'un[
champ ( 7.29.2.2/12 )).La plupart des aspects des
wscanf()
fonctions -family de la remise desp
champs ( 7.29.2.2/12 ).La signification des fonctions de la famille
wstrtod()
de certains aspects du formatage NaN pris en charge ( 7.29.4.1.1 / 4 ).wstrtod()
si leswstrtod()
la famillewstrtod()
placenterrno
àERANGE
lorsque le résultat est sous- jacent ( 7.29.4.1.1 / 10 ).
Décalage à droite d'un entier négatif
int signed_integer = -1;
// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;
Affectation d'une valeur hors plage à un entier
// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;
Allouer zéro octet
// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);
Représentation d'entiers signés
Chaque type entier signé peut être représenté dans l'un des trois formats; c'est l'implémentation qui est utilisée. L'implémentation utilisée pour tout type entier signé au moins aussi large que int
peut être déterminée à l'exécution à partir des deux bits de poids faible de la représentation de la valeur -1
dans ce type, comme ceci:
enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)
switch (SIGN_REP(long)) {
case sign_magnitude: { /* do something */ break; }
case ones_compl: { /* do otherwise */ break; }
case twos_compl: { /* do yet else */ break; }
case 0: { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}
Le même modèle s'applique à la représentation des types plus étroits, mais ils ne peuvent pas être testés par cette technique car les opérandes de &
sont soumis aux "conversions arithmétiques habituelles" avant que le résultat ne soit calculé.