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 macro CHAR_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 da int main(int argc, char *arg[]) e int 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 e LDBL_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 del signed char o del unsigned char ( 6.2.5 / 15 ). Può essere interrogato con CHAR_MIN , che è 0 o SCHAR_MIN se char 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 di unsigned int o signed int ( 6.7.2 / 5 ).

  • Quali tipi di bitfield possono essere utilizzati, ad eccezione di _Bool qualificato _Bool , signed int e unsigned 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 da STDC ( 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 da setlocale() ( 7.11.1.1/3 ).

Funzioni matematiche

  • I tipi rappresentati da float_t e double_t quando la macro FLT_EVAL_METHOD ha un valore diverso da 0 , 1 e 2 ( 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 se errno è impostato su ERANGE 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 o fmod() 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 o remquo() 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 e SIGSEGV 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 di scanf() -family ( 7.21.6.2/12 ).

  • Il valore errno impostato da fgetpos() in caso di errore ( 7.21.9.1/2 ).

  • Il valore errno impostato da fsetpos() in caso di errore ( 7.21.9.3/2 ).

  • Il valore errno impostato da ftell() 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() impostano errno su ERANGE 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 e time_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() impostano errno su ERANGE 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow