C Language
Implementeringsdefinerat beteende
Sök…
Anmärkningar
Översikt
C-standarden beskriver språksyntaxen, funktionerna som tillhandahålls av standardbiblioteket och beteendet hos överensstämmande C-processorer (grovt sett, kompilatorer) och överensstämmande C-program. När det gäller beteende anger standarden för det mesta vissa beteenden för program och processorer. Å andra sidan har vissa operationer uttryckligt eller implicit odefinierat beteende - sådana operationer måste alltid undvikas, eftersom du inte kan lita på något om dem. Däremellan finns det en mängd olika implementeringsdefinerade beteenden. Dessa beteenden kan variera mellan C-processorer, driftstider och standardbibliotek (tillsammans, implementeringar ), men de är konsekventa och pålitliga för varje given implementering, och överensstämmande implementeringar dokumenterar deras beteende inom vart och ett av dessa områden.
Det är ibland rimligt att ett program förlitar sig på implementeringsdefinerat beteende. Till exempel, om programmet ändå är specifikt för en viss driftmiljö, är det osannolikt att det är ett problem att förlita sig på implementeringsdefinerade beteenden som är generella för de gemensamma processorerna för den miljön. Alternativt kan man använda villkorade sammanställningsdirektiv för att välja implementeringsdefinerade beteenden som är lämpliga för implementeringen som används. I vilket fall som helst är det viktigt att veta vilka operationer som har implementeringsdefinerat beteende, för att antingen undvika dem eller fatta ett informerat beslut om och hur man använder dem.
Balansen mellan dessa anmärkningar utgör en lista över alla implementeringsdefinerade beteenden och egenskaper som anges i C2011-standarden, med referenser till standarden. Många av dem använder standarden . Vissa andra förlitar sig mer generellt på konteksten av standarden, till exempel de åtta stegen för att översätta källkoden till ett program, eller skillnaden mellan värd och fristående implementationer. Vissa som kan vara särskilt överraskande eller anmärkningsvärda presenteras med fet typsnitt. Inte allt beteende som beskrivs stöds av tidigare C-standarder, men generellt sett har de implementeringsdefinerat beteende i alla versioner av standarden som stöder dem.
Program och processorer
Allmän
Antalet bitar i en byte ( 3,6 / 3 ). Minst
8
kan det verkliga värdet ifrågasättas med makroCHAR_BIT
.Vilka utgående meddelanden betraktas som "diagnostiska meddelanden" ( 3.10 / 1 )
Källöversättning
Det sätt på vilket fysiska källfils multibytatecken mappas till källteckenuppsättningen ( 5.1.1.2/1 ).
Huruvida icke-tomma sekvenser av icke-ny linje whitespace ersätts av enstaka mellanslag under översättningsfas 3 ( 5.1.1.2/1 )
Exekveringsuppsättningstecken ( -tecknen ) till vilka teckenbokstäver och tecken i strängkonstanter konverteras (under översättningsfas 5) när det annars inte finns något motsvarande tecken ( 5.1.1.2/1 ).
Driftsmiljö
Det sätt på vilket de diagnostiska meddelandena som ska sändas identifieras ( 5.1.1.3/1 ).
Namnet och typen av den funktion som anropas vid start i en fristående implementering ( 5.1.2.1/1 ).
Vilka biblioteksfaciliteter finns tillgängliga i en fristående implementering, utöver en specificerad minimal uppsättning ( 5.1.2.1/1 )
Effekten av programavslut i en fristående miljö ( 5.1.2.1/2 ).
I en värdmiljö är alla tillåtna signaturer för
main()
-funktionen annan änint main(int argc, char *arg[])
ochint main(void)
( 5.1.2.2.1 / 1 ).Det sätt på vilket en värd implementering definierar de strängar som det andra argumentet till
main()
( 5.1.2.2.1 / 2 ) pekar på .Vad som utgör en "interaktiv enhet" för avsnitten 5.1.2.3 (Utförande av program) och 7.21.3 (Filer) ( 5.1.2.3/7 ).
Eventuella begränsningar för objekt som refereras av interrupt-handler-rutiner i en optimeringsimplementering ( 5.1.2.3/10 ).
I en fristående implementering, om flera trådar för körning stöds ( 5.1.2.4/1 ).
Värdena för medlemmarna i exekveringsteckenuppsättningen ( 5.2.1 / 1 ).
char
värdena som motsvarar de definierade alfabetiska flykt-sekvenserna ( 5.2.2 / 3 ).De heltal och flytande punkt numeriska gränser och egenskaper ( 5.2.4.2/1 ).
Noggrannheten för flytande punkt aritmetiska operationer och av standardbibliotekets omvandlingar från interna flytande punktrepresentationer till strängrepresentationer ( 5.2.4.2.2 / 6 ).
Värdet på makro
FLT_ROUNDS
, som kodar för standardrundningsläget för flytande punkt ( 5.2.4.2.2 / 8 ).Avrundningsbeteenden som kännetecknas av stödda värden på
FLT_ROUNDS
större än 3 eller mindre än -1 ( 5.2.4.2.2 / 8 ).Värdet på makro
FLT_EVAL_METHOD
, som karakteriserarFLT_EVAL_METHOD
flytande punkt ( 5.2.4.2.2 / 9 ).Beteendet kännetecknas av alla stödda värden på
FLT_EVAL_METHOD
mindre än -1 ( 5.2.4.2.2 / 9 ).Värdena på makron
FLT_HAS_SUBNORM
,DBL_HAS_SUBNORM
ochLDBL_HAS_SUBNORM
, som kännetecknar om standardformat för flytande punkt stöder undernormala nummer ( 5.2.4.2.2 / 10 )
typer
Resultatet av att försöka (indirekt) få åtkomst till ett objekt med trådlagringsvaraktighet från en annan tråd än den som objektet är associerat med ( 6.2.4 / 4 )
Värdet på en
char
till vilken ett tecken utanför den grundläggande exekveringsuppsättningen har tilldelats ( 6.2.5 / 3 ).De stödda utökade signerade heltalstyperna, om några, ( 6.2.5 / 4 ), och eventuella förlängningsnyckelord som används för att identifiera dem.
Oavsett om
char
har samma representation och beteende somsigned char
eller somunsigned char
( 6.2.5 / 15 ). Kan ifrågasättas medCHAR_MIN
, som är antingen0
ellerSCHAR_MIN
omchar
är inte signerad respektive signerad.Antal, ordning och kodning av byte i representationer av objekt , utom om det uttryckligen anges i standarden ( 6.2.6.1/2 ).
Vilken av de tre igenkända formerna för heltalrepresentation gäller i en given situation, och om vissa bitmönster för heltalsobjekt är trap-representationer ( 6.2.6.2/2 ).
Justeringskravet för varje typ ( 6.2.8 / 1 ).
Huruvida och i vilka sammanhang stöds utvidgade anpassningar ( 6.2.8 / 3 ).
Uppsättningen av stödda utökade justeringar ( 6.2.8 / 4 ).
Heltalskonverteringsraden för alla utökade signerade heltalstyper relativt varandra ( 6.3.1.1/1 ).
Effekten av att tilldela ett värde utanför området till ett signerat heltal ( 6.3.1.3/3 ).
När ett inom räckvidd men orepresenterbart värde tilldelas ett flytande punktobjekt, väljs hur det representabla värdet som lagras i objektet väljs mellan de två närmaste representabla värdena ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).
Resultatet av att konvertera ett heltal till en pekartyp , med undantag för heltalskonstantuttryck med värdet
0
( 6.3.2.3/5 ).
Källformulär
#pragma
inom#pragma
direktiven där rubriknamnetokens känns igen ( 6.4 / 4 ).Tecknen, inklusive multibytta tecken, andra än understruk, oaccenterade latinska bokstäver, universella teckennamn och decimalsiffror som kan visas i identifierare ( 6.4.2.1/1 ).
Antalet betydande tecken i en identifierare ( 6.4.2.1/5 ).
Med några undantag mappas sättet på vilket källtecken i en heltalsteckenkonstant mappas till exekveringsuppsatta tecken ( 6.4.4.4/2 ; 6.4.4.4/10 ).
Det nuvarande landskapet som används för att beräkna värdet på en bred teckenkonstant och de flesta andra aspekter av konverteringen för många sådana konstanter ( 6.4.4.4/11 ).
Huruvida olika prefixerade brettsträngslitterära symboler kan sammanlänkas och i så fall behandlingen av den resulterande multibytta teckenföljden ( 6.4.5 / 5 )
Landskapsområdet som användes under översättningsfas 7 för att konvertera breda stränglitteraler till multibytes karaktärsekvenser, och deras värde när resultatet inte kan representeras i exekveringsteckenuppsättningen ( 6.4.5 / 6 ).
Det sätt på vilket rubriknamn mappas till filnamn ( 6.4.7 / 2 ).
Utvärdering
Huruvida och hur flytande
FP_CONTRACT
kontrakteras närFP_CONTRACT
inte används ( 6.5 / 8 ).Värdena på resultaten för
sizeof
och_Alignof
( 6.5.3.4/5 ).Storleken på resultattypen för pekarsubtraktion ( 6.5.6 / 9 ).
Resultatet av att högerförskjuta ett signerat heltal med ett negativt värde ( 6.5.7 / 5 ).
Runtime beteende
I vilken utsträckning
register
är effektivt ( 6.7.1 / 6 ).Oavsett om typen av ett bitfält som deklareras som
int
är samma typ somunsigned int
eller somsigned int
( 6.7.2 / 5 ).Vilka typer bitfält kan ta, annat än valfritt kvalificerad
_Bool
,signed int
ochunsigned int
; om bitfält kan ha atomtyper ( 6.7.2.1/5 ).Aspekter av hur implementationer lägger ut lagring för bitfält ( 6.7.2.1/11 ).
Anpassningen av icke-bitfältmedlemmar i strukturer och fackföreningar ( 6.7.2.1/14 ).
Den underliggande typen för varje uppräknad typ ( 6.7.2.2/4 ).
Vad som utgör en "åtkomst" till ett objekt av
volatile
kvalificerad typ ( 6.7.3 / 7 ).Effektiviteten av
inline
funktionsdeklarationer ( 6.7.4 / 6 ).
Preprocessor
Huruvida karaktärskonstanter konverteras till heltalvärden på samma sätt i förbehandlingsbetingelser som i vanliga uttryck, och om en enstaka teckenkonstant kan ha ett negativt värde ( 6.10.1 / 4 ).
Platserna sökte efter filer som anges i ett
#include
include- direktiv ( 6.10.2 / 2-3 ).Det sätt på vilket ett rubriknamn bildas från symbolerna för ett multitoken
#include
include- direktiv ( 6.10.2 / 4 ).Gränsen för
#include
inkludera häckning ( 6.10.2 / 6 ).Huruvida ett
\
tecken infogas innan\
inför ett universellt teckennamn i resultatet av förarbetarens#
-operatör ( 6.10.3.2/2 ).Uppförandet av
#pragma
förbehandlingsdirektivet för andraSTDC
änSTDC
( 6.10.6 / 1 ).Värdet på
__DATE__
och__TIME__
om inget översättningsdatum respektive tid är tillgängligt ( 6.10.8.1/1 ).Den interna teckenkodningen som används för
wchar_t
om makro__STDC_ISO_10646__
inte är definierad ( 6.10.8.2/1 ).Den interna teckenkodningen som används för
char32_t
om makro__STDC_UTF_32__
inte är definierad ( 6.10.8.2/1 ).
Standardbibliotek
Allmän
- Formatet för meddelanden som släpps ut när påståenden misslyckas ( 7.2.1.1/2 ).
Flyttalsmiljöfunktioner
Eventuella ytterligare undantag från flytande punkter utöver de som definieras av standarden ( 7.6 / 6 ).
Eventuella ytterligare avvecklingslägen för flytande punkter utöver de som definieras av standarden ( 7.6 / 8 ).
Eventuella ytterligare flytpunktsmiljöer utöver de som definieras av standarden ( 7.6 / 10 ).
Standardvärdet för växlingspunktsmiljöåtkomstomkopplaren ( 7.6.1 / 2 ).
Representationen av
fegetexceptflag()
inspelade avfegetexceptflag()
( 7.6.2.2/1 ).Oavsett om
feraiseexcept()
-funktionen dessutom höjer det "inexakt" flytande punktundantaget närhelst det höjer "overflow" eller "underflow" flytande punkt undantag ( 7.6.2.3/2 ).
Lokalrelaterade funktioner
- De andra strängarna än
"C"
stöds avsetlocale()
( 7.11.1.1/3 ).
Matematiska funktioner
De typer som representeras av
float_t
ochdouble_t
närFLT_EVAL_METHOD
har ett värde som skiljer sig från0
,1
och2
( 7.12 / 2 ).Alla stödda flyttalsklassificeringar utöver de som definieras av standarden ( 7.12 / 6 ).
Värdet som returneras av
math.h
funktionerna vid ett domänfel ( 7.12.1 / 2 ).Värdet som returneras av
math.h
funktionerna vid ett polfel ( 7.12.1 / 3 ).Värdet som returneras av
math.h
fungerar när resultatet underflöden och aspekter av huruvidaerrno
är inställt påERANGE
och om ett flytandeERANGE
höjs under dessa omständigheter ( 7.12.1 / 6 ).Standardvärdet för FP-sammandragningsomkopplaren ( 7.12.2 / 2 ).
Oavsett om
fmod()
-funktionerna returnerar 0 eller höjer ett domänfel när deras andra argument är 0 ( 7.12.10.1/3 ).Oavsett om
remainder()
-funktioner returnerar 0 eller höjer ett domänfel när deras andra argument är 0 ( 7.12.10.2/3 ).Antalet betydande bitar i kvotmodulerna beräknade med
remquo()
-funktionerna ( 7.12.10.3/2 ).Oavsett om
remquo()
-funktionerna returnerar 0 eller höjer ett domänfel när deras andra argument är 0 ( 7.12.10.3/3 ).
signaler
Den kompletta uppsättningen av signaler som stöds, deras semantik och standardhantering ( 7.14 / 4 ).
När en signal lyftes och det finns en anpassad hanterare som är associerad med den signalen, vilka signaler, om några, är blockerade under körningens körning ( 7.14.1.1/3 ).
Vilka andra signaler än
SIGFPE
,SIGILL
ochSIGSEGV
gör att beteendet vid återkomst från en anpassad signalhanterare inte definieras ( 7.14.1.1/3 ).Vilka signaler som initialt är konfigurerade för att ignoreras (oavsett standardhantering; 7.14.1.1/6 ).
Diverse
- Den specifika nollpekarkonstanten till vilken makro
NULL
expanderar ( 7.19 / 3 ).
Filhanteringsfunktioner
Huruvida den sista raden i en textström kräver en avslutande ny linje ( 7.21.2 / 2 ).
Antalet nolltecken bifogades automatiskt till en binär ström ( 7.21.2 / 3 ).
Den ursprungliga positionen för en fil öppnas i bilagningsläge ( 7.21.3 / 1 ).
Huruvida en skrivning på en textström gör att strömmen trunkeras ( 7.21.3 / 2 ).
Stöd för strömbuffring ( 7.21.3 / 3 ).
Huruvida filer med noll längd faktiskt finns ( 7.21.3 / 4 ).
Reglerna för att komponera giltiga filnamn ( 7.21.3 / 8 ).
Huruvida samma fil samtidigt kan vara öppen flera gånger ( 7.21.3 / 8 ).
Arten och valet av kodning för multibytta tecken ( 7.21.3 / 10 ).
Beteendet för funktionen
remove()
när målfilen är öppen ( 7.21.4.1/2 ).Beteendet för
rename()
när målfilen redan finns ( 7.21.4.2/2 ).Huruvida filer som skapats via
tmpfile()
tas bort om programmet avviker onormalt ( 7.21.4.3/2 ).Vilket läge ändras under vilka omständigheter som är tillåtna via
freopen()
( 7.21.5.4/3 ).
I / O-funktioner
Vilken av de tillåtna representationerna av oändliga FP-värden som inte är ett antal produceras av printf () - familjefunktionerna ( 7.21.6.1/8 ).
Det sätt på vilket pekare formateras av
printf()
-familjfunktionerna ( 7.21.6.1/8 ).Uppförandet hos
scanf()
-familjen fungerar när-
tecknet visas i en intern position för skannlistan i ett[
fält ( 7.21.6.2/12 ).De flesta aspekterna av
scanf()
-familjen fungerar att lämnap
fält ( 7.21.6.2/12 ).errno
värdet inställt avfgetpos()
vid fel ( 7.21.9.1/2 ).errno
värdet inställt avfsetpos()
vid fel ( 7.21.9.3/2 ).errno
värdet inställt avftell()
vid fel ( 7.21.9.4/3 ).Betydelsen för
strtod()
-familjfunktionerna för vissa stödda aspekter av en NaN-formatering ( 7.22.1.3p4 ).Huruvida
strtod()
-familjfunktionerna ställer inerrno
tillERANGE
när resultatet underströmmar ( 7.22.1.3/10 ).
Funktioner för minnesallokering
- Uppförandet av minnesallokeringsfunktionerna när antalet byte begärs är 0 ( 7.22.3 / 1 ).
Systemmiljöfunktioner
Vilka saneringar, om några, utförs och vilken status returneras till värdens OS när funktionen för
abort()
kallas ( 7.22.4.1/2 ).Vilken status returneras till värdmiljön när
exit()
kallas ( 7.22.4.4/5 ).Hanteringen av öppna strömmar och vilken status som returneras till
_Exit()
när_Exit()
kallas ( 7.22.4.5/2 ).Uppsättningen av
getenv()
tillgängliga viagetenv()
och metoden för att förändra miljön ( 7.22.4.6/2 ).Returvärdet för
system()
( 7.22.4.8/3 ).
Datum- och tidsfunktioner
Den lokala tidszonen och sommartid ( 7.27.1 / 1 ).
clock_t
intervall och precision som kan representeras via typernaclock_t
ochtime_t
( 7.27.1 / 4 ).Början av eran som fungerar som referens för de tider som returneras av
clock()
( 7.27.2.1/3 ).Början av epok som fungerar som referens för de tider som returneras av
timespec_get()
(närTIME_UTC
ärTIME_UTC
; 7.27.2.5/3 ).strftime()
för%Z
konverteringsspecifikationen i "C" -området ( 7.27.3.5/7 ).
I / O-funktioner med bred karaktär
Vilken av de tillåtna representationerna av oändliga FP-värden som inte är ett antal produceras av
wprintf()
-familjfunktionerna ( 7.29.2.1/8 ).Det sätt på vilket pekare formateras av
wprintf()
-familjen ( 7.29.2.1/8 ).wscanf()
hoswscanf()
-familjen fungerar när-
tecknet visas i en intern position för skannlistan för ett[
fält ( 7.29.2.2/12 ).De flesta aspekterna av
wscanf()
-familjfunktionernas överlämnande avp
fält ( 7.29.2.2/12 ).Betydelsen för
wstrtod()
-familjfunktioner för vissa stöttade aspekter av NaN-formatering ( 7.29.4.1.1 / 4 ).Huruvida
wstrtod()
-familjfunktionerna ställer inerrno
tillERANGE
när resultatet undervannar ( 7.29.4.1.1 / 10 ).
Höger skift av ett negativt heltal
int signed_integer = -1;
// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;
Tilldela ett värde utanför området till ett heltal
// 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;
Tilldela nollbyte
// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);
Representation av signerade heltal
Varje signerad heltalstyp kan representeras i vilket som helst av tre format; det är implementeringsdefinerat vilken som används. Implementeringen som används för varje given signerad heltalstyp som är minst lika bred som int
kan bestämmas vid körning från de två bitarna med lägsta ordning för representationen av värdet -1
i den typen, så:
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"); }
}
Samma mönster gäller för representation av smalare typer, men de kan inte testas med denna teknik eftersom operandema för &
är föremål för "de vanliga aritmetiska omvandlingarna" innan resultatet beräknas.