Loading AI tools
розділ сирцевого коду програми, який виконується, але результат якого ніколи не використовується в подальших обчисленнях З Вікіпедії, вільної енциклопедії
В теорії компіляторів, ме́ртвим ко́дом (англ. dead code, так само відме́рлим ко́дом, ма́рним ко́дом, неви́користаним ко́дом) називають код, який може бути виконаним (в чинній на поточний момент версії кодової бази), виконувався або міг бути виконаним раніше (до внесення в код на якомусь із моментів його існування змін, які зробили його марним), але результати його обчислень не впливають на подальшу роботу програми (зокрема, не використовуються)[1][2][3]. Іншими словами це код, що визначає тільки мертві змінні[en] або взагалі не визначає ніяких змінних.
Коли йдеться про початковий код, часто використовують загальніше поняття мертвого (відмерлого) коду, яке, крім марного коду, включає також недосяжний код[4][5].
Наявність у програмі мертвого коду збільшує її обсяг, тиск на ресурси (пристрої, регістри), тепловиділення і може збільшити час виконання, не несучи при цьому ніякої користі. В оптимізувальних компіляторах для виявлення і видалення мертвого і недосяжного кодів на рівні проміжного подання[en] використовують оптимізації видалення мертвого коду і видалення недосяжного коду. Для пошуку мертвого коду в сирцевому коді застосовують усілякі аналізатори і детектори мертвого коду[4][5]. Такі аналізатори, часто вбудовані в компілятор або IDE, виводять під час компіляції програми попередження про наявність у ній мертвого коду[6][7][8].
Розглянемо такий приклад мовою Сі:
int foo(int x, int y)
{
int z; /* Оголошення мертвої змінної */
z = x/y; /* Мертвий код */
return x*y;
}
Тут операція z = x/y
є мертвим (марним) кодом, оскільки результат роботи цієї операції, змінна z
, надалі в програмі не використовується. Сама змінна z
є мертвою в процедурі foo
. Якщо змінна y
дорівнює нулю, то операція, яка виконує марне обчислення, спровокує виняток, отже її видалення, можливо, здатне змінити вивід програми. Оптимізація видалення мертвого коду видалить операцію z = x/y
, тільки якщо не буде сумнівів у тому, що через це не зміниться результат роботи програми[9].
Стосовно до початкового коду, недосяжний код часто називають мертвим, хоча, з точки зору теорії компіляторів, це різні речі. Розглянемо такий приклад:
int foo(void)
{
int x = 25;
return x;
x = 2*x; /* Недосяжний код */
return 0; /* Недосяжний код */
}
Тут, операції x = 2*x
і return 0
не будуть виконані за жодних умов, оскільки вони записані після безумовного повернення з процедури і є недосяжними (операції, що стоять після повернення з процедури можуть і не бути недосяжним кодом, наприклад, якщо на мітку, що стоїть після повернення посилається оператор goto). Оптимізація видалення недосяжного коду може видалити ці операції.
Для виявлення і видалення непотрібного коду, оптимізація видалення мертвого коду використовує результати аналізу потоку даних[en] (наприклад аналізу активних змінних[en]) або самостійно аналізує SSA-подання програми. Оптимізація видалення недосяжного коду аналізує граф потоку керування і усуває недосяжні вузли.
При роботі з марним кодом використовують консервативний підхід: якщо операція, що виконує марну дію, може провокувати виняток, і існує ненульова ймовірність того, що цей виняток впливає на вивід програми, то цієї операції видаляти не потрібно[9].
У сирцевому коді великих застосунків буває складно розпізнати мертвий код (марний і недосяжний). Для цього можуть застосовуватися детектори мертвого коду[4][5], що виконують статичний аналіз коду. Багато компіляторів і ІСР видають попередження про оголошені, але невикористовувані функції, методи, класи, змінні[6][7][8].
Для приховування алгоритмів, використовуваних у програмі, з метою захисту інтелектуальної власності, мертвий код може додаватися в програму навмисно, як затінювальне перетворення. Таке перетворення покликане збільшити ентропію коду, щоб ускладнити відновлення алгоритму, реалізованого в програмі. Так само, з метою затінення, в програму може додаватися недосяжний некоректний код: під час роботи програми така ділянка коду ніколи не виконується і не викликає помилок, але дизассемблер або декомпілятор під час роботи з цією ділянкою коду можуть повестися непередбачувано[10][11].
Наявність у програмі мертвого і недосяжного кодів може бути уразливістю, оскільки в такі ділянки коду можуть впроваджуватися програмні закладки[12][13].
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.