Udefineret adfærd

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 15. april 2014; checks kræver 20 redigeringer .

Udefineret adfærd ( engelsk  undefined behavior , i en række kilder uforudsigelig adfærd [1] [2] ) er en egenskab ved nogle programmeringssprog (mest mærkbar i C ), softwarebiblioteker og hardware i visse marginale situationer for at producere et resultat, der afhænger af implementeringen af ​​compileren (bibliotek, mikrochips) og tilfældige faktorer som hukommelsens tilstand eller det udløste interrupt . Med andre ord specifikationdefinerer ikke sprogets adfærd (bibliotek, chip) i alle mulige situationer, men siger: "under betingelse A er resultatet af operation B udefineret." At tillade en sådan situation i programmet betragtes som en fejl; selvom programmet kører med succes på en compiler, vil det ikke være på tværs af platforme og kan fejle på en anden maskine, i et andet OS eller med andre compilerindstillinger.

Udefineret adfærd må ikke forveksles med uspecificeret adfærd , hvor specifikationen ikke tillader nogen adfærd, men kun et begrænset udvalg af implementeringsmuligheder.

Eksempler

I C, for eksempel, resulterer brug af en variabel, før den er blevet initialiseret, i udefineret adfærd. Ifølge specifikationen skal compileren gøre det, der virker mest effektivt/simpelt i dette tilfælde. Udefineret adfærd opstår, når der gøres et forsøg på at få adgang til en variabel.

Biblioteker kontrollerer muligvis ikke NULL- pointere af præstationsmæssige årsager.

I x86-processorer , hvis der er to serielle I/O-porte, og du vil skrive information først til den ene port og derefter til den anden, skal dette gøres en byte ad gangen, da rækkefølgen for ankomst af bytes til udstyret er ikke garanteret.

Et andet eksempel på udefineret adfærd: en nysgerrighed med ANSI - "#pragma"-direktivet . Ifølge sprogspecifikationen får compilere fuld frihed til at håndtere denne konstruktion. Før version 1.17 forsøgte GCC -kompileren, da dette direktiv var i kildekoden, at starte Emacs med Towers of Hanoi-spillet. [3]

Et andet eksempel på udefineret adfærd er følgende kode:

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

Når den udføres, kan variablen iantage værdierne 13 eller 14 for C/C++, 13 for Java , PHP og C# , 12, når den er implementeret i LISP . Usikkerhed i C og C++ skyldes det faktum, at i henhold til C- og C++-standarderne kan bivirkninger (det vil sige en stigning i dette tilfælde) anvendes på et hvilket som helst tidspunkt, der er bekvemt for compileren mellem to sekvenspunkter .

Fordele

  • At definere nogle operationer som "udefinerede" fører til, at sådanne sprog (ofte kendetegnet ved mangel på indbygget grænsekontrol osv.) forenkler specifikationen og øger en vis fleksibilitet.
  • Arbejdet med programmer fremskyndes (da det ikke er nødvendigt at kontrollere alle slags "marginale" tilfælde).

Ulemper

  • Garanterer ikke fuld kompatibilitet mellem forskellige implementeringer af sproget.
  • Det er op til programmøren at undgå situationer med udefineret adfærd.

Noter

  1. Programmering i C/C++. Tutorial . — Dialektika, 2003-01-01. — 348 s. — ISBN 9785845904607 .
  2. Pavlovskaya Tatyana Alexandrovna. C/C++. Procedurel og objektorienteret programmering. Lærebog for gymnasier. 3. generations standard . — "Forlag" "Peter" "", 30-07-2014. — 496 s. — ISBN 9785496001090 .
  3. En pragmatisk beslutning | D-Macs ting . Dato for adgang: 21. marts 2009. Arkiveret fra originalen 1. juni 2009.

Links