В теорії компіляторів, ме́ртвим ко́дом (англ. dead code, так само відме́рлим ко́дом, ма́рним ко́дом, неви́користаним ко́дом) називають код, який може бути виконаним (в чинній на поточний момент версії кодової бази), виконувався або міг бути виконаним раніше (до внесення в код на якомусь із моментів його існування змін, які зробили його марним), але результати його обчислень не впливають на подальшу роботу програми (зокрема, не використовуються). Іншими словами це код, що визначає тільки [en] або взагалі не визначає ніяких змінних.
Коли йдеться про початковий код, часто використовують загальніше поняття мертвого (відмерлого) коду, яке, крім марного коду, включає також недосяжний код.
Наявність у програмі мертвого коду збільшує її обсяг, тиск на ресурси (пристрої, регістри), тепловиділення і може збільшити час виконання, не несучи при цьому ніякої користі. В оптимізувальних компіляторах для виявлення і видалення мертвого і недосяжного кодів на рівні [en] використовують оптимізації видалення мертвого коду і видалення недосяжного коду. Для пошуку мертвого коду в сирцевому коді застосовують усілякі аналізатори і детектори мертвого коду. Такі аналізатори, часто вбудовані в компілятор або IDE, виводять під час компіляції програми попередження про наявність у ній мертвого коду.
Приклади
Розглянемо такий приклад мовою Сі:
int foo(int x, int y) { int z; /* Оголошення мертвої змінної */ z = x/y; /* Мертвий код */ return x*y; }
Тут операція z = x/y
є мертвим (марним) кодом, оскільки результат роботи цієї операції, змінна z
, надалі в програмі не використовується. Сама змінна z
є мертвою в процедурі foo
. Якщо змінна y
дорівнює нулю, то операція, яка виконує марне обчислення, спровокує виняток, отже її видалення, можливо, здатне змінити (вивід) програми. Оптимізація видалення мертвого коду видалить операцію z = x/y
, тільки якщо не буде сумнівів у тому, що через це не зміниться результат роботи програми.
Стосовно до початкового коду, недосяжний код часто називають мертвим, хоча, з точки зору теорії компіляторів, це різні речі. Розглянемо такий приклад:
int foo(void) { int x = 25; return x; x = 2*x; /* Недосяжний код */ return 0; /* Недосяжний код */ }
Тут, операції x = 2*x
і return 0
не будуть виконані за жодних умов, оскільки вони записані після безумовного повернення з процедури і є недосяжними (операції, що стоять після повернення з процедури можуть і не бути недосяжним кодом, наприклад, якщо на мітку, що стоїть після повернення посилається оператор goto). Оптимізація видалення недосяжного коду може видалити ці операції.
Аналіз
Для виявлення і видалення непотрібного коду, оптимізація видалення мертвого коду використовує результати [en] (наприклад [en]) або самостійно аналізує програми. Оптимізація видалення недосяжного коду аналізує граф потоку керування і усуває недосяжні вузли.
При роботі з марним кодом використовують консервативний підхід: якщо операція, що виконує марну дію, може провокувати виняток, і існує ненульова ймовірність того, що цей виняток впливає на (вивід) програми, то цієї операції видаляти не потрібно.
У сирцевому коді великих застосунків буває складно розпізнати мертвий код (марний і недосяжний). Для цього можуть застосовуватися детектори мертвого коду, що виконують статичний аналіз коду. Багато компіляторів і ІСР видають попередження про оголошені, але невикористовувані функції, методи, класи, змінні.
Мертвий код та інформаційна безпека
Для приховування алгоритмів, використовуваних у програмі, з метою захисту інтелектуальної власності, мертвий код може додаватися в програму навмисно, як затінювальне перетворення. Таке перетворення покликане збільшити ентропію коду, щоб ускладнити відновлення алгоритму, реалізованого в програмі. Так само, з метою затінення, в програму може додаватися недосяжний некоректний код: під час роботи програми така ділянка коду ніколи не виконується і не викликає помилок, але дизассемблер або декомпілятор під час роботи з цією ділянкою коду можуть повестися непередбачувано.
Наявність у програмі мертвого і недосяжного кодів може бути уразливістю, оскільки в такі ділянки коду можуть впроваджуватися програмні закладки.
Див. також
Примітки
- Engineering a Compiler — С. 544.
- Компиляторы — принципы, технологии, инструменты — С. 713, 714.
- Debray, S. K., Evans, W., Muth, R., and De Sutter, B. 2000. Compiler techniques for code compaction [ 22 травня 2003 у Wayback Machine.]. ACM Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 378—415. (summary)
- Dead code detection and removal. Aivosto. Архів оригіналу за 5 серпня 2012. Процитовано 12 липня 2012.
- Compares some free alternatives to DCD (Dead Code Detector). Java.net. Архів оригіналу за 23 вересня 2012. Процитовано 12 липня 2012.
- GCC online documentation. Options to Request or Suppress Warnings. GNU Compiler Collection. Архів оригіналу за 25 червня 2012. Процитовано 12 липня 2012.
- JDT Plug-in Developer Guide. Compiling Java code. eclipse.org. Архів оригіналу за 25 червня 2012. Процитовано 22 жовтня 2018.
- Discover dead code in your application using Code Analysis. Habib Heydarian, Microsoft Corp. Архів оригіналу за 23 вересня 2012. Процитовано 12 липня 2012.
- Modern Compiler Implementation in Java. — Cambridge University Press, 2004. — С. 360. — .
- И. Ю. Иванов / Київський національний університет імені Тараса Шевченка / О проблемах защиты интеллектуальной собственности в программных системах // Проблеми прграмування. — 2006. — № 2-3 Спеціальний випуск — С. 68-72. (текст [ 2014-01-16 у Wayback Machine.])
- Обфускация и её преодоление // Лаборатория взлома. — Май 2006. — С. 8-13. ()
- Торшенко Ю. А. / СПб ГУ ИТМО / Модель и метод обнаружения уязвимостей на начальных этапах промышленного проектирования программного продукта. — 2008. (текст)
- Сакулина М. С. / Выявление и устранение «мертвого кода» с использованием технологии программирования IBM Rational Application Developer. (текст Архивировано)
Література
- Cooper and Torczon. Engineering a Compiler. — Morgan Kaufmann, 2011. — С. 544—550, 593. — .
- Ахо, Альфред В.; Сети, Рави; Ульман, Джеффри Д. Компиляторы — принципы, технологии, инструменты. — Вильямс, 2003. — С. 713, 714, 733, 734. — .
- Muchnick, Steven S. Advanced Compiler Design and Implementation. — , 1997. — С. 592—597. — .
Посилання
- Проблема мертвого коду в архітектурі вебдодатків. (рос.)
- (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V teoriyi kompilyatoriv me rtvim ko dom angl dead code tak samo vidme rlim ko dom ma rnim ko dom nevi koristanim ko dom nazivayut kod yakij mozhe buti vikonanim v chinnij na potochnij moment versiyi kodovoyi bazi vikonuvavsya abo mig buti vikonanim ranishe do vnesennya v kod na yakomus iz momentiv jogo isnuvannya zmin yaki zrobili jogo marnim ale rezultati jogo obchislen ne vplivayut na podalshu robotu programi zokrema ne vikoristovuyutsya Inshimi slovami ce kod sho viznachaye tilki en abo vzagali ne viznachaye niyakih zminnih Koli jdetsya pro pochatkovij kod chasto vikoristovuyut zagalnishe ponyattya mertvogo vidmerlogo kodu yake krim marnogo kodu vklyuchaye takozh nedosyazhnij kod Nayavnist u programi mertvogo kodu zbilshuye yiyi obsyag tisk na resursi pristroyi registri teplovidilennya i mozhe zbilshiti chas vikonannya ne nesuchi pri comu niyakoyi koristi V optimizuvalnih kompilyatorah dlya viyavlennya i vidalennya mertvogo i nedosyazhnogo kodiv na rivni en vikoristovuyut optimizaciyi vidalennya mertvogo kodu i vidalennya nedosyazhnogo kodu Dlya poshuku mertvogo kodu v sircevomu kodi zastosovuyut usilyaki analizatori i detektori mertvogo kodu Taki analizatori chasto vbudovani v kompilyator abo IDE vivodyat pid chas kompilyaciyi programi poperedzhennya pro nayavnist u nij mertvogo kodu PrikladiRozglyanemo takij priklad movoyu Si int foo int x int y int z Ogoloshennya mertvoyi zminnoyi z x y Mertvij kod return x y Tut operaciya z x y ye mertvim marnim kodom oskilki rezultat roboti ciyeyi operaciyi zminna z nadali v programi ne vikoristovuyetsya Sama zminna z ye mertvoyu v proceduri foo Yaksho zminna y dorivnyuye nulyu to operaciya yaka vikonuye marne obchislennya sprovokuye vinyatok otzhe yiyi vidalennya mozhlivo zdatne zminiti vivid programi Optimizaciya vidalennya mertvogo kodu vidalit operaciyu z x y tilki yaksho ne bude sumniviv u tomu sho cherez ce ne zminitsya rezultat roboti programi Stosovno do pochatkovogo kodu nedosyazhnij kod chasto nazivayut mertvim hocha z tochki zoru teoriyi kompilyatoriv ce rizni rechi Rozglyanemo takij priklad int foo void int x 25 return x x 2 x Nedosyazhnij kod return 0 Nedosyazhnij kod Tut operaciyi x 2 x i return 0 ne budut vikonani za zhodnih umov oskilki voni zapisani pislya bezumovnogo povernennya z proceduri i ye nedosyazhnimi operaciyi sho stoyat pislya povernennya z proceduri mozhut i ne buti nedosyazhnim kodom napriklad yaksho na mitku sho stoyit pislya povernennya posilayetsya operator goto Optimizaciya vidalennya nedosyazhnogo kodu mozhe vidaliti ci operaciyi AnalizDlya viyavlennya i vidalennya nepotribnogo kodu optimizaciya vidalennya mertvogo kodu vikoristovuye rezultati en napriklad en abo samostijno analizuye programi Optimizaciya vidalennya nedosyazhnogo kodu analizuye graf potoku keruvannya i usuvaye nedosyazhni vuzli Pri roboti z marnim kodom vikoristovuyut konservativnij pidhid yaksho operaciya sho vikonuye marnu diyu mozhe provokuvati vinyatok i isnuye nenulova jmovirnist togo sho cej vinyatok vplivaye na vivid programi to ciyeyi operaciyi vidalyati ne potribno U sircevomu kodi velikih zastosunkiv buvaye skladno rozpiznati mertvij kod marnij i nedosyazhnij Dlya cogo mozhut zastosovuvatisya detektori mertvogo kodu sho vikonuyut statichnij analiz kodu Bagato kompilyatoriv i ISR vidayut poperedzhennya pro ogolosheni ale nevikoristovuvani funkciyi metodi klasi zminni Mertvij kod ta informacijna bezpekaDlya prihovuvannya algoritmiv vikoristovuvanih u programi z metoyu zahistu intelektualnoyi vlasnosti mertvij kod mozhe dodavatisya v programu navmisno yak zatinyuvalne peretvorennya Take peretvorennya poklikane zbilshiti entropiyu kodu shob uskladniti vidnovlennya algoritmu realizovanogo v programi Tak samo z metoyu zatinennya v programu mozhe dodavatisya nedosyazhnij nekorektnij kod pid chas roboti programi taka dilyanka kodu nikoli ne vikonuyetsya i ne viklikaye pomilok ale dizassembler abo dekompilyator pid chas roboti z ciyeyu dilyankoyu kodu mozhut povestisya neperedbachuvano Nayavnist u programi mertvogo i nedosyazhnogo kodiv mozhe buti urazlivistyu oskilki v taki dilyanki kodu mozhut vprovadzhuvatisya programni zakladki Div takozhTupikovij zapis Nedosyazhnij kod Vidalennya nedosyazhnogo kodu Vidalennya mertvogo koduPrimitkiEngineering a Compiler S 544 Kompilyatory principy tehnologii instrumenty S 713 714 Debray S K Evans W Muth R and De Sutter B 2000 Compiler techniques for code compaction 22 travnya 2003 u Wayback Machine ACM Trans Program Lang Syst 22 2 Mar 2000 378 415 summary Dead code detection and removal Aivosto Arhiv originalu za 5 serpnya 2012 Procitovano 12 lipnya 2012 Compares some free alternatives to DCD Dead Code Detector Java net Arhiv originalu za 23 veresnya 2012 Procitovano 12 lipnya 2012 GCC online documentation Options to Request or Suppress Warnings GNU Compiler Collection Arhiv originalu za 25 chervnya 2012 Procitovano 12 lipnya 2012 JDT Plug in Developer Guide Compiling Java code eclipse org Arhiv originalu za 25 chervnya 2012 Procitovano 22 zhovtnya 2018 Discover dead code in your application using Code Analysis Habib Heydarian Microsoft Corp Arhiv originalu za 23 veresnya 2012 Procitovano 12 lipnya 2012 Modern Compiler Implementation in Java Cambridge University Press 2004 S 360 ISBN 0 511 04286 8 I Yu Ivanov Kiyivskij nacionalnij universitet imeni Tarasa Shevchenka O problemah zashity intellektualnoj sobstvennosti v programmnyh sistemah Problemi prgramuvannya 2006 2 3 Specialnij vipusk S 68 72 tekst 2014 01 16 u Wayback Machine Obfuskaciya i eyo preodolenie Laboratoriya vzloma Maj 2006 S 8 13 Torshenko Yu A SPb GU ITMO Model i metod obnaruzheniya uyazvimostej na nachalnyh etapah promyshlennogo proektirovaniya programmnogo produkta 2008 tekst Sakulina M S Vyyavlenie i ustranenie mertvogo koda s ispolzovaniem tehnologii programmirovaniya IBM Rational Application Developer tekst Arhivirovano LiteraturaCooper and Torczon Engineering a Compiler Morgan Kaufmann 2011 S 544 550 593 ISBN 978 0 12 088478 0 Aho Alfred V Seti Ravi Ulman Dzheffri D Kompilyatory principy tehnologii instrumenty Vilyams 2003 S 713 714 733 734 ISBN 5 8459 0189 8 Muchnick Steven S Advanced Compiler Design and Implementation 1997 S 592 597 ISBN 1 55860 320 4 PosilannyaProblema mertvogo kodu v arhitekturi vebdodatkiv ros angl