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.
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 .