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 - 8kan det verkliga värdet ifrågasättas med makro- CHAR_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 än- int main(int argc, char *arg[])och- int 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 ). 
- charvä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_ROUNDSstörre än 3 eller mindre än -1 ( 5.2.4.2.2 / 8 ).
- Värdet på makro - FLT_EVAL_METHOD, som karakteriserar- FLT_EVAL_METHODflytande punkt ( 5.2.4.2.2 / 9 ).
- Beteendet kännetecknas av alla stödda värden på - FLT_EVAL_METHODmindre än -1 ( 5.2.4.2.2 / 9 ).
- Värdena på makron - FLT_HAS_SUBNORM,- DBL_HAS_SUBNORMoch- LDBL_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 - chartill 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 - charhar samma representation och beteende som- signed chareller som- unsigned char( 6.2.5 / 15 ). Kan ifrågasättas med- CHAR_MIN, som är antingen- 0eller- SCHAR_MINom- charä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
- #pragmainom- #pragmadirektiven 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_CONTRACTkontrakteras när- FP_CONTRACTinte används ( 6.5 / 8 ).
- Värdena på resultaten för - sizeofoch- _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 som- unsigned inteller som- signed int( 6.7.2 / 5 ).
- Vilka typer bitfält kan ta, annat än valfritt kvalificerad - _Bool,- signed intoch- unsigned 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 - volatilekvalificerad typ ( 6.7.3 / 7 ).
- Effektiviteten av - inlinefunktionsdeklarationer ( 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 - #includeinclude- direktiv ( 6.10.2 / 2-3 ).
- Det sätt på vilket ett rubriknamn bildas från symbolerna för ett multitoken - #includeinclude- direktiv ( 6.10.2 / 4 ).
- Gränsen för - #includeinkludera 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 - #pragmaförbehandlingsdirektivet för andra- STDCän- STDC( 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_tom makro- __STDC_ISO_10646__inte är definierad ( 6.10.8.2/1 ).
- Den interna teckenkodningen som används för - char32_tom 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 av- fegetexceptflag()( 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_toch- double_tnär- FLT_EVAL_METHODhar ett värde som skiljer sig från- 0,- 1och- 2( 7.12 / 2 ).
- Alla stödda flyttalsklassificeringar utöver de som definieras av standarden ( 7.12 / 6 ). 
- Värdet som returneras av - math.hfunktionerna vid ett domänfel ( 7.12.1 / 2 ).
- Värdet som returneras av - math.hfunktionerna vid ett polfel ( 7.12.1 / 3 ).
- Värdet som returneras av - math.hfungerar när resultatet underflöden och aspekter av huruvida- errnoär inställt på- ERANGEoch om ett flytande- ERANGEhö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,- SIGILLoch- SIGSEGVgö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 NULLexpanderar ( 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ämna- pfält ( 7.21.6.2/12 ).
- errnovärdet inställt av- fgetpos()vid fel ( 7.21.9.1/2 ).
- errnovärdet inställt av- fsetpos()vid fel ( 7.21.9.3/2 ).
- errnovärdet inställt av- ftell()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 in- errnotill- ERANGEnä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 via- getenv()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_tintervall och precision som kan representeras via typerna- clock_toch- time_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är- TIME_UTCär- TIME_UTC; 7.27.2.5/3 ).
- strftime()för- %Zkonverteringsspecifikationen 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()hos- wscanf()-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 av- pfä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 in- errnotill- ERANGEnä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.