Odefinierat beteende

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 15 april 2014; kontroller kräver 20 redigeringar .

Odefinierat beteende ( engelska  undefined behavior , i ett antal källor oförutsägbart beteende [1] [2] ) är en egenskap hos vissa programmeringsspråk (mest märkbar i C ), mjukvarubibliotek och hårdvara i vissa marginella situationer för att producera ett resultat som beror på implementeringen av kompilatorn (bibliotek, mikrochips) och slumpmässiga faktorer som minnets tillstånd eller det utlösta avbrottet . Med andra ord, specifikationen definierar inte språkets beteende (bibliotek, chip) i alla möjliga situationer, utan säger: "under villkor A är resultatet av operation B odefinierat." Att tillåta en sådan situation i programmet anses vara ett misstag; även om programmet körs framgångsrikt på någon kompilator, kommer det inte att vara plattformsoberoende och kan misslyckas på en annan dator, i ett annat operativsystem eller med andra kompilatorinställningar.

Odefinierat beteende ska inte förväxlas med ospecificerat beteende , där specifikationen inte tillåter något beteende, utan endast ett begränsat utbud av implementeringsalternativ.

Exempel

I C, till exempel, resulterar användning av en variabel innan den har initierats i odefinierat beteende. Enligt specifikationen ska kompilatorn göra det som verkar mest effektivt/enklast i det här fallet. Odefinierat beteende uppstår när ett försök görs att komma åt en variabel.

Bibliotek kanske inte kontrollerar NULL- pekare av prestandaskäl.

I x86-processorer , om det finns två seriella I/O-portar och du vill skriva information först till en port och sedan till den andra, bör detta göras en byte i taget, eftersom ordningen för ankomsten av bytes till utrustningen är inte garanterat.

Ett annat exempel på odefinierat beteende: en nyfikenhet med ANSI - "#pragma"-direktivet . Enligt språkspecifikationen ges kompilatorer fullständig frihet att hantera denna konstruktion. Före version 1.17 försökte GCC- kompilatorn, när detta direktiv fanns i källkoden, att starta Emacs med Towers of Hanoi-spelet. [3]

Ett annat exempel på odefinierat beteende är följande kod:

int i = 5 ; i = ++ i + ++ i ;

När den exekveras kan variabeln ianta värdena 13 eller 14 för C/C++, 13 för Java , PHP och C# , 12 när den implementeras i LISP . Osäkerheten i C och C++ beror på det faktum att enligt C- och C++-standarderna kan biverkningar (det vill säga en ökning i det här fallet) appliceras när som helst som är lämplig för kompilatorn mellan två sekvenspunkter .

Fördelar

  • Att definiera vissa operationer som "odefinierade" leder till att sådana språk (ofta kännetecknas av brist på inbyggd gränskontroll, etc.) förenklar specifikationen och ökar viss flexibilitet.
  • Arbetet med program påskyndas (eftersom det inte är nödvändigt att kontrollera alla typer av "marginella" fall).

Nackdelar

  • Garanterar inte full kompatibilitet mellan olika implementeringar av språket.
  • Det är upp till programmeraren att undvika situationer med odefinierat beteende.

Anteckningar

  1. Programmering i C/C++. Handledning . — Dialektika, 2003-01-01. — 348 sid. — ISBN 9785845904607 .
  2. Pavlovskaya Tatyana Alexandrovna. C/C++. Procedurell och objektorienterad programmering. Lärobok för gymnasieskolor. 3:e generationens standard . — "Förlag" "Peter" "", 2014-07-30. — 496 sid. — ISBN 9785496001090 .
  3. Ett pragmatiskt beslut | D-Macs grejer . Tillträdesdatum: 21 mars 2009. Arkiverad från originalet 1 juni 2009.

Länkar