C Language
Comportamento definito dall'implementazione
Ricerca…
Osservazioni
Panoramica
Lo standard C descrive la sintassi del linguaggio, le funzioni fornite dalla libreria standard e il comportamento di processori C conformi (in parole povere, compilatori) e programmi C conformi. Per quanto riguarda il comportamento, lo standard per la maggior parte specifica comportamenti particolari per programmi e processori. D'altra parte, alcune operazioni hanno un comportamento indefinito esplicito o implicito - tali operazioni devono sempre essere evitate, poiché non si può fare affidamento su nulla su di esse. Nel mezzo, ci sono una varietà di comportamenti definiti dall'implementazione . Questi comportamenti possono variare tra processori C, runtime e librerie standard (collettivamente, implementazioni ), ma sono coerenti e affidabili per ogni specifica implementazione e le implementazioni conformi documentano il loro comportamento in ciascuna di queste aree.
Talvolta è ragionevole che un programma faccia affidamento su un comportamento definito dall'implementazione. Ad esempio, se il programma è comunque specifico per un particolare ambiente operativo, è improbabile che fare affidamento su comportamenti generali definiti dall'implementazione per i processori comuni per quell'ambiente sia un problema. In alternativa, è possibile utilizzare direttive di compilazione condizionale per selezionare comportamenti definiti dall'implementazione appropriati per l'implementazione in uso. In ogni caso, è essenziale sapere quali operazioni hanno un comportamento definito dall'implementazione, in modo da evitarle o prendere una decisione informata su se e come usarle.
Il bilancio di queste osservazioni costituisce un elenco di tutti i comportamenti e le caratteristiche definiti dall'implementazione specificati nello standard C2011, con riferimenti allo standard. Molti di loro usano la terminologia dello standard . Alcuni altri si basano più generalmente sul contesto dello standard, come le otto fasi di traduzione del codice sorgente in un programma o la differenza tra implementazioni ospitate e indipendenti. Alcuni che possono essere particolarmente sorprendenti o notevoli sono presentati in grassetto. Non tutti i comportamenti descritti sono supportati da precedenti standard C, ma, in generale, hanno un comportamento definito dall'implementazione in tutte le versioni dello standard che li supportano.
Programmi e processori
Generale
Il numero di bit in un byte ( 3.6 / 3 ). Almeno
8
, il valore attuale può essere interrogato con la macroCHAR_BIT
.Quali messaggi di output sono considerati "messaggi diagnostici" ( 3.10 / 1 )
Traduzione di origine
Il modo in cui i caratteri multibyte del file sorgente fisico sono mappati sul set di caratteri sorgente ( 5.1.1.2/1 ).
Se le sequenze non vuote di spazi non di nuova riga sono sostituite da spazi singoli durante la fase di traduzione 3 ( 5.1.1.2/1 )
I caratteri del set di esecuzioni a cui i caratteri letterali e i caratteri delle costanti di stringa vengono convertiti (durante la fase di traduzione 5) quando non esiste altrimenti un carattere corrispondente ( 5.1.1.2/1 ).
Ambiente operativo
Il modo in cui vengono identificati i messaggi diagnostici da emettere ( 5.1.1.3/1 ).
Il nome e il tipo della funzione chiamata all'avvio in un'implementazione indipendente ( 5.1.2.1/1 ).
Quali strutture di libreria sono disponibili in un'implementazione indipendente, oltre un set minimo specificato ( 5.1.2.1/1 ).
L'effetto della terminazione del programma in un ambiente indipendente ( 5.1.2.1/2 ).
In un ambiente ospitato, qualsiasi firma consentita per la funzione
main()
diversa daint main(int argc, char *arg[])
eint main(void)
( 5.1.2.2.1 / 1 ).Il modo in cui un'implementazione in hosting definisce le stringhe puntate dal secondo argomento a
main()
( 5.1.2.2.1 / 2 ).Cosa costituisce un "dispositivo interattivo" ai fini delle sezioni 5.1.2.3 (Esecuzione del programma) e 7.21.3 (File) ( 5.1.2.3/7 ).
Qualsiasi restrizione sugli oggetti a cui fanno riferimento le routine di gestione degli interrupt in un'implementazione di ottimizzazione ( 5.1.2.3/10 ).
In un'implementazione indipendente, sono supportati più thread di esecuzione ( 5.1.2.4/1 ).
I valori dei membri del set di caratteri di esecuzione ( 5.2.1 / 1 ).
I valori
char
corrispondenti alle sequenze di escape alfabetiche definite ( 5.2.2 / 3 ).I limiti numerici e le caratteristiche a virgola mobile e intera ( 5.2.4.2/1 ).
Precisione delle operazioni aritmetiche in virgola mobile e delle conversioni della libreria standard dalle rappresentazioni in virgola mobile interne alle rappresentazioni di stringhe ( 5.2.4.2.2 / 6 ).
Il valore della macro
FLT_ROUNDS
, che codifica la modalità di arrotondamento a virgola mobile predefinita ( 5.2.4.2.2 / 8 ).I comportamenti di arrotondamento caratterizzati da valori supportati di
FLT_ROUNDS
superiori a 3 o inferiori a -1 ( 5.2.4.2.2 / 8 ).Il valore della macro
FLT_EVAL_METHOD
, che caratterizza il comportamento di valutazione a virgola mobile ( 5.2.4.2.2 / 9 ).Il comportamento caratterizzato da qualsiasi valore supportato di
FLT_EVAL_METHOD
inferiore a -1 ( 5.2.4.2.2 / 9 ).I valori delle macro
FLT_HAS_SUBNORM
,DBL_HAS_SUBNORM
eLDBL_HAS_SUBNORM
, che caratterizzano se i formati standard in virgola mobile supportano numeri subnormali ( 5.2.4.2.2 / 10 )
tipi
Il risultato del tentativo di accedere (indirettamente) a un oggetto con durata di memorizzazione del thread da un thread diverso da quello a cui è associato l'oggetto ( 6.2.4 / 4 )
Il valore di un
char
a cui è stato assegnato un carattere al di fuori del set di esecuzione di base ( 6.2.5 / 3 ).I tipi interi con segno esteso supportati, se presenti, ( 6.2.5 / 4 ) e le eventuali parole chiave di estensione utilizzate per identificarli.
Se
char
ha la stessa rappresentazione e comportamento delsigned char
o delunsigned char
( 6.2.5 / 15 ). Può essere interrogato conCHAR_MIN
, che è0
oSCHAR_MIN
sechar
non è firmato o firmato, rispettivamente.Il numero, l'ordine e la codifica dei byte nelle rappresentazioni di oggetti , tranne dove specificato esplicitamente dallo standard ( 6.2.6.1/2 ).
Quale delle tre forme riconosciute di rappresentazione intera si applica in una data situazione e se determinati modelli di bit di oggetti interi sono rappresentazioni di trap ( 6.2.6.2/2 ).
Il requisito di allineamento di ciascun tipo ( 6.2.8 / 1 ).
Se e in quali contesti sono supportati gli allineamenti estesi ( 6.2.8 / 3 ).
Il set di allineamenti estesi supportati ( 6.2.8 / 4 ).
I ranghi interi di conversione di tutti i tipi interi con segno esteso relativi tra loro ( 6.3.1.1/1 ).
L'effetto dell'assegnazione di un valore fuori intervallo a un intero con segno ( 6.3.1.3/3 ).
Quando un valore in-range ma non rappresentabile è assegnato a un oggetto a virgola mobile, come viene scelto il valore rappresentabile memorizzato nell'oggetto tra i due valori rappresentabili più vicini ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).
Il risultato della conversione di un intero in un tipo di puntatore , ad eccezione delle espressioni costanti intere con valore
0
( 6.3.2.3/5 ).
Modulo di origine
Le posizioni all'interno delle direttive
#pragma
cui sono riconosciuti i token del nome dell'intestazione ( 6.4 / 4 ).I caratteri, inclusi i caratteri multibyte, diversi dal carattere di sottolineatura, lettere latine non accentate, nomi di caratteri universali e cifre decimali che possono apparire negli identificatori ( 6.4.2.1/1 ).
Il numero di caratteri significativi in un identificatore ( 6.4.2.1/5 ).
Con alcune eccezioni, il modo in cui i caratteri di origine in una costante di carattere intero sono mappati ai caratteri del set di esecuzione ( 6.4.4.4/2 ; 6.4.4.4/10 ).
Le impostazioni locali correnti utilizzate per calcolare il valore di una costante di carattere ampia e la maggior parte degli altri aspetti della conversione per molte di queste costanti ( 6.4.4.4/11 ).
Se i token letterali a stringa ampia con prefisso diverso possono essere concatenati e, in tal caso, il trattamento della sequenza di caratteri multibyte risultante ( 6.4.5 / 5 )
Le impostazioni internazionali utilizzate durante la fase di conversione 7 per convertire i letterali di stringa ampia in sequenze di caratteri multibyte e il loro valore quando il risultato non è rappresentabile nel set di caratteri di esecuzione ( 6.4.5 / 6 ).
Il modo in cui i nomi delle intestazioni sono mappati ai nomi dei file ( 6.4.7 / 2 ).
Valutazione
Se e in che modo le espressioni floating-point sono contratte quando
FP_CONTRACT
non viene utilizzato ( 6.5 / 8 ).I valori dei risultati degli operatori
sizeof
e_Alignof
( 6.5.3.4/5 ).La dimensione del tipo di risultato della sottrazione del puntatore ( 6.5.6 / 9 ).
Il risultato di spostare a destra un numero intero con segno con un valore negativo ( 6.5.7 / 5 ).
Comportamento di runtime
La misura in cui la parola chiave del
register
è efficace ( 6.7.1 / 6 ).Se il tipo di un bitfield dichiarato come
int
è dello stesso tipo diunsigned int
osigned int
( 6.7.2 / 5 ).Quali tipi di bitfield possono essere utilizzati, ad eccezione di
_Bool
qualificato_Bool
,signed int
eunsigned int
; se i bitfield possono avere tipi atomici ( 6.7.2.1/5 ).Aspetti di come le implementazioni definiscono lo spazio per i bitfield ( 6.7.2.1/11 ).
L'allineamento dei membri non bitfield di strutture e sindacati ( 6.7.2.1/14 ).
Il tipo sottostante per ogni tipo enumerato ( 6.7.2.2/4 ).
Che cosa costituisce un "accesso" a un oggetto di tipo
volatile
-qualificato ( 6.7.3 / 7 ).L'efficacia delle dichiarazioni di funzioni
inline
( 6.7.4 / 6 ).
preprocessore
Se le costanti di caratteri vengono convertite in valori interi allo stesso modo in condizionali del preprocessore come in espressioni ordinarie e se una costante a carattere singolo può avere un valore negativo ( 6.10.1 / 4 ).
Le posizioni hanno cercato i file designati in una direttiva
#include
( 6.10.2 / 2-3 ).Il modo in cui un nome di intestazione è formato dai token di una direttiva
#include
multi-token ( 6.10.2 / 4 ).Il limite per
#include
nesting ( 6.10.2 / 6 ).Se un carattere
\
è inserito prima di\
introdurre un nome di carattere universale nel risultato dell'operatore#
del preprocessore ( 6.10.3.2/2 ).Il comportamento della direttiva di pre-elaborazione
#pragma
le direttive diverse daSTDC
(STDC
/ 1 ).Il valore delle macro
__DATE__
e__TIME__
se non sono disponibili né la data né l'ora della traduzione ( 6.10.8.1/1 ).La codifica dei caratteri interni utilizzata per
wchar_t
se la macro__STDC_ISO_10646__
non è definita ( 6.10.8.2/1 ).La codifica dei caratteri interni utilizzata per
char32_t
se la macro__STDC_UTF_32__
non è definita ( 6.10.8.2/1 ).
Libreria standard
Generale
- Il formato dei messaggi emessi quando le asserzioni falliscono ( 7.2.1.1/2 ).
Funzioni ambientali a virgola mobile
Eventuali eccezioni a virgola mobile aggiuntive oltre a quelle definite dallo standard ( 7.6 / 6 ).
Eventuali modalità di arrotondamento a virgola mobile aggiuntive oltre a quelle definite dallo standard ( 7.6 / 8 ).
Eventuali ambienti aggiuntivi a virgola mobile oltre a quelli definiti dallo standard ( 7.6 / 10 ).
Il valore predefinito dell'interruttore di accesso all'ambiente in virgola mobile ( 7.6.1 / 2 ).
La rappresentazione dei flag di stato a virgola mobile registrati da
fegetexceptflag()
( 7.6.2.2/1 ).Se la funzione
feraiseexcept()
solleva ulteriormente l'eccezione "inesatta" a virgola mobile ogni volta che solleva l'eccezione "overflow" o "underflow" a virgola mobile ( 7.6.2.3/2 ).
Funzioni relative alle impostazioni locali
- Le stringhe locali diverse da
"C"
supportate dasetlocale()
( 7.11.1.1/3 ).
Funzioni matematiche
I tipi rappresentati da
float_t
edouble_t
quando la macroFLT_EVAL_METHOD
ha un valore diverso da0
,1
e2
( 7.12 / 2 ).Qualsiasi classificazione a virgola mobile supportata oltre a quelle definite dallo standard ( 7.12 / 6 ).
Il valore restituito dalle funzioni
math.h
in caso di errore di dominio ( 7.12.1 / 2 ).Il valore restituito dalle funzioni
math.h
in caso di errore polare ( 7.12.1 / 3 ).Il valore restituito dalle funzioni
math.h
quando il risultato è underflow, e gli aspetti seerrno
è impostato suERANGE
e se viene sollevata un'eccezione a virgola mobile in tali circostanze ( 7.12.1 / 6 ).Il valore predefinito dell'interruttore di contrazione FP ( 7.12.2 / 2 ).
Se le funzioni
fmod()
restituiscono 0 ofmod()
un errore di dominio quando il loro secondo argomento è 0 ( 7.12.10.1/3 ).Se le funzioni
remainder()
restituiscono 0 o generano un errore di dominio quando il loro secondo argomento è 0 ( 7.12.10.2/3 ).Il numero di bit significativi nei moduli dei quozienti calcolati dalle funzioni
remquo()
( 7.12.10.3/2 ).Se le funzioni
remquo()
restituiscono 0 oremquo()
un errore di dominio quando il loro secondo argomento è 0 ( 7.12.10.3/3 ).
segnali
Il set completo di segnali supportati, la loro semantica e la loro gestione predefinita ( 7.14 / 4 ).
Quando viene alzato un segnale e vi è un gestore personalizzato associato a quel segnale, i segnali, se presenti, vengono bloccati per la durata dell'esecuzione dell'handler ( 7.14.1.1/3 ).
Quali segnali diversi da
SIGFPE
,SIGILL
eSIGSEGV
sì che il comportamento al ritorno da un gestore di segnale personalizzato non sia definito ( 7.14.1.1/3 ).Quali segnali sono inizialmente configurati per essere ignorati (indipendentemente dalla loro gestione predefinita, 7.14.1.1/6 ).
miscellaneo
- La costante puntatore nullo specifica a cui si espande la macro
NULL
( 7.19 / 3 ).
Funzioni di gestione dei file
Se l'ultima riga di un flusso di testo richiede una terminazione finale ( 7.21.2 / 2 ).
Il numero di caratteri nulli aggiunti automaticamente a un flusso binario ( 7.21.2 / 3 ).
La posizione iniziale di un file aperta in modalità append ( 7.21.3 / 1 ).
Se una scrittura su un flusso di testo provoca il troncamento del flusso ( 7.21.3 / 2 ).
Supporto per il buffer del flusso ( 7.21.3 / 3 ).
Esistono effettivamente file a lunghezza zero ( 7.21.3 / 4 ).
Le regole per la composizione di nomi di file validi ( 7.21.3 / 8 ).
Se lo stesso file può essere aperto contemporaneamente più volte ( 7.21.3 / 8 ).
La natura e la scelta della codifica per i caratteri multibyte ( 7.21.3 / 10 ).
Il comportamento della funzione
remove()
quando il file di destinazione è aperto ( 7.21.4.1/2 ).Il comportamento della funzione
rename()
quando esiste già il file di destinazione ( 7.21.4.2/2 ).Se i file creati tramite la funzione
tmpfile()
vengono rimossi nel caso in cui il programma termini in modo anomalo ( 7.21.4.3/2 ).Quale modalità cambia in base alle circostanze consentite tramite
freopen()
( 7.21.5.4/3 ).
Funzioni I / O
Quale tra le rappresentazioni consentite di valori FP infiniti e non-un numero è prodotta dalle funzioni family printf () ( 7.21.6.1/8 ).
Il modo in cui i puntatori sono formattati dalle funzioni
printf()
-family ( 7.21.6.1/8 ).Il comportamento di
scanf()
-family funziona quando il carattere-
appare in una posizione interna della lista di scansione di un[
campo ( 7.21.6.2/12 ).La maggior parte degli aspetti del passaggio di funzioni
p
discanf()
-family ( 7.21.6.2/12 ).Il valore
errno
impostato dafgetpos()
in caso di errore ( 7.21.9.1/2 ).Il valore
errno
impostato dafsetpos()
in caso di errore ( 7.21.9.3/2 ).Il valore
errno
impostato daftell()
in caso di errore ( 7.21.9.4/3 ).Il significato delle
strtod()
di alcuni aspetti supportati di una formattazione NaN ( 7.22.1.3p4 ).Se le
strtod()
impostanoerrno
suERANGE
quando il risultato è underflow ( 7.22.1.3/10 ).
Funzioni di allocazione della memoria
- Il comportamento delle funzioni di allocazione della memoria quando il numero di byte richiesti è 0 ( 7.22.3 / 1 ).
Funzioni dell'ambiente di sistema
Quali puliture, se ve ne sono, vengono eseguite e quale stato viene restituito al SO host quando viene chiamata la funzione
abort()
( 7.22.4.1/2 ).Quale stato viene restituito all'ambiente host quando viene chiamato
exit()
( 7.22.4.4/5 ).La gestione degli stream aperti e quale stato viene restituito all'ambiente host quando viene chiamato
_Exit()
( 7.22.4.5/2 ).L'insieme di nomi di ambiente accessibili tramite
getenv()
e il metodo per alterare l'ambiente ( 7.22.4.6/2 ).Il valore restituito dalla funzione
system()
( 7.22.4.8/3 ).
Funzioni di data e ora
Il fuso orario locale e l'ora legale ( 7.27.1 / 1 ).
La gamma e la precisione degli orari rappresentabili tramite i tipi
clock_t
etime_t
( 7.27.1 / 4 ).L'inizio dell'era che funge da riferimento per i tempi restituiti dalla funzione
clock()
( 7.27.2.1/3 ).L'inizio dell'epoca che funge da riferimento per i tempi restituiti dalla funzione
timespec_get()
(quando la base dei tempi èTIME_UTC
; 7.27.2.5/3 ).La sostituzione
strftime()
per lo specificatore di conversione%Z
nella locale "C" ( 7.27.3.5/7 ).
Funzioni I / O a caratteri ampi
Quale tra le rappresentazioni consentite di valori FP infiniti e non-un numero è prodotta dalle
wprintf()
-famiglia ( 7.29.2.1/8 ).Il modo in cui i puntatori sono formattati dalle
wprintf()
funzioni -Family ( 7.29.2.1/8 ).Il comportamento di
wscanf()
-family funziona quando il carattere-
appare in una posizione interna della lista di scansione di un[
campo ( 7.29.2.2/12 ).La maggior parte degli aspetti dei
wscanf()
-family functions 'p
( 7.29.2.2/12 ).Il significato delle
wstrtod()
di alcuni aspetti supportati della formattazione NaN ( 7.29.4.1.1 / 4 ).Se le
wstrtod()
impostanoerrno
suERANGE
quando il risultato è underflow ( 7.29.4.1.1 / 10 ).
Spostamento a destra di un numero intero negativo
int signed_integer = -1;
// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;
Assegnazione di un valore fuori intervallo a un numero intero
// 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;
Assegnazione di zero byte
// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);
Rappresentazione di interi con segno
Ogni tipo di intero con segno può essere rappresentato in uno qualsiasi dei tre formati; è definito dall'implementazione quale viene utilizzato. L'implementazione in uso per qualsiasi dato intero con segno di almeno ampiezza come int
può essere determinata in fase di esecuzione dai due bit di ordine inferiore della rappresentazione del valore -1
in quel tipo, in questo modo:
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"); }
}
Lo stesso modello si applica alla rappresentazione di tipi più stretti, ma non possono essere testati con questa tecnica perché gli operandi di &
sono soggetti alle "solite conversioni aritmetiche" prima che il risultato sia calcolato.