Недосяжний кодУ програмуванні та теорії компіляторів, недося́жним ко́дом називають частину коду програми, яка за жодних умов не може бути виконаною, оскільки є недосяжною в графі потоку управління[1][2]. Недосяжний код часто вважають одним із типів мертвого коду, така термінологія зазвичай застосовується при розгляді сирцевого коду програми[3][4]. Однак у теорії компіляторів, ці поняття ніяк не пов'язані, мертвим кодом там називають тільки досяжний код, який не впливає на вивід програми[1][2][5]. Основні недоліки наявності в програмі недосяжного коду:
Причини виникненняІснування недосяжного коду обумовлюють різні фактори, наприклад:
В останніх п'яти випадках, недосяжний код є успадкованим, тобто це код, який раніше був корисним, але зараз не використовується. ПрикладРозглянемо наступний приклад на мові Сі: int foo(int x, int y)
{
return x + y;
int z = x*y; /* Недостижимый код */
}
Операція АналізПошук недосяжного коду в сирцевому коді можна провести за допомогою статичного аналізу коду[3][4]. За використання оптимізувального компілятора, виявити і видалити недосяжний код здатна оптимізація видалення недосяжного коду, яка знаходить у графі потоку керування недосяжні вузли і видаляє їх[6]. Простий аналіз цього графа на наявність недосяжних вузлів часто буває реалізованим у компіляторі у вигляді окремої функції, так званого прибиральника, яка викликається зразу після перетворень, здатних змінювати граф потоку керування[7]. Код може ставати недосяжним унаслідок виконання компілятором інших перетворень над проміжним поданням[en], наприклад оптимізації усунення спільних підвиразів.
На практиці, складність реалізованого аналізу істотно впливає на кількість виявленого недосяжного коду. Наприклад, після згортання констант[en] і простого аналізу потоку керування можна виявити, що код усередині оператора int foo(void)
{
int n = 2 + 1;
if (n > 4)
{
printf("%d", n); /* Недостижимый код */
}
}
Однак, для того щоб виявити недосяжний код у наступному прикладі, слід застосувати значно складніший алгоритм аналізу: int foo(void)
{
double x = sqrt(2);
if (x > 4)
{
printf("%lf", x); /* Недостижимый код */
}
}
Одним із практичних рішень є підхід, за якого спочатку виконується простий аналіз наявності недосяжного коду, а потім використовується профілювальник для опрацювання складніших випадків. Профілювальник не може довести, що певна ділянка коду є недосяжною, але він може бути гарною евристикою для пошуку підозрілих вузлів, які, ймовірно, є недосяжними. Після виявлення цих потенційно недосяжних вузлів, можна застосувати якийсь потужний алгоритм аналізу недосяжного коду. Див. такожПримітки
Література
|