﻿# Недостижимый код

Недостижимый код \(unreachable code\) \- фрагмент программы, который никогда не выполняется\.

Не стоит путать недостижимый код с [мёртвым кодом](https://ru.wikipedia.org/wiki/%d0%9c%d1%91%d1%80%d1%82%d0%b2%d1%8b%d0%b9_%d0%ba%d0%be%d0%b4)\. Мёртвый код, в отличие недостижимого кода, выполняется в программе, но ни как не влияет на результат её работы\.

Появление в программах недостижимого кода обусловлено различными факторами\. Часто эти фрагменты могут быть заполнены произвольными вычислениями, которые могут быть очень похожими на выполняемый код\. Поскольку недостижимый код никогда не выполняется, его наличие в программе приводит только к увеличению размера исходного кода, но не уменьшает скорость работы приложения\. Однако, наличие недостижимого кода может свидетельствовать о наличии ошибки в логике работы программы\. Общая задача обнаружения недостижимого кода алгоритмически неразрешима\. Однако большинство ошибок, связанных с недостижимым кодом просты и могут быть обнаружены компилятором или различными инструментами\. Для выявления недостижимого кода используется статический анализ кода, основанный на различных эвристических методах\.

Приведём несколько простых примеров недостижимого кода\.

Пример первый:

```cpp
int func(int a)
{
   int b = a*2;
   return b;

   // Недостижимый код
   if (b < 10)
   {
        b += 10;
   }
   return b;
}
```

В этом примере условие 'b<10' никогда не выполнится, так как оно находится ниже оператора безусловного возврата из функции\. Поскольку условие 'b<10' ни когда не выполнится, то и переменная 'b' ни при каких условиях не будет увеличена на 10\.

Пример второй:

```cpp
vector<string> vec;
while (true)
{
   vec.push_back("abc");

   if (vec.size() > 25)
   {
       return 0;
   }
}

// Недостижимый код
vec.pop_back();
```

В этом примере в бесконечном цикле идёт наполнение контейнера 'vec' строкой "abc", когда размер контейнера 'vec' превысит 25, вызовется оператор return, который немедленно прекратит работу функции и вернёт управление в точку возврата\. По этой причине никогда не будет удалён последний элемент контейнера 'vec'\.

Третий пример:

```cpp
tStatus = TGetFirstLayerItem (pContext, DBX_LAYER_MULTI, pLayerItem);
...
if (DBX_LAYER_MULTI && tStatus == DBX_OK)
{
    // Запись стилей
}
```

В этом примере ни когда не будет записан список стилей проекта, поскольку условие \(DBX\_LAYER\_MULTI && tStatus \=\= DBX\_OK\) всегда ложно\. В условии используется константа DBX\_LAYER\_MULTI равная нулю\.

Пример четвёртый:

```cpp
typedef unsigned short wint_t;

void lexungetc(wint_t c) {
  if (c < 0)
    return;
  ....
}
```

В этом примере условие 'c<0' всегда ложь, поскольку 'c' \- беззнаковое число\.

Наиболее эффективно такие ошибки можно диагностировать еще на этапе создания программы с использованием инструментов [статического анализа кода](https://pvs-studio.ru/ru/blog/terms/0046/)\.

Часто недостижимый код используется на практике\. Например, используют блоки "if \(false\)" для выключения фрагментов кода\. Это позволяет сохранять устаревший или недописанный код, который затем можно будет включить в программу\. Выключенный код будет поддерживаться средствами рефакторинга, что уменьшает проблемы связанные с включением в проект таких фрагментов кода\. Так же блок "if \(false\)" можно использовать для пошаговой отладки перемещая в него текущую точку выполнения программы\. При этом в блоке можно реализовать вычисления или вывод данных, которые могут понадобится при отладке кода\. Таким образом, получают код, который никогда не будет вызван самой программой, но в который всегда при желании можно зайти по ходу отладки\.

## Библиографический список

1. Википедия\. [Недостижимый код\.](https://ru.wikipedia.org/wiki/%d0%9d%d0%b5%d0%b4%d0%be%d1%81%d1%82%d0%b8%d0%b6%d0%b8%d0%bc%d1%8b%d0%b9_%d0%ba%d0%be%d0%b4)
1. MSDN\. [Compiler Warning \(level 4\) CS0429](https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/compiler-messages/cs0429)\.
1. Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман Компиляторы, принципы, технологии и инструментарий\. \- 2 изд\. \- М\.: Вильямс, 2008\. \- ISBN 978\-5\-8459\-1349\-4, 1178 стр\. Стр\. 669 \(устранение недостижимого кода\)\.
1. Habrahabr\. [В чём смысл?](https://habr.com/ru/company/infopulse/blog/137385/)
1. [Examples of errors detected by the V637 diagnostic\.](https://pvs-studio.ru/ru/blog/examples/v637/)
1. [Examples of errors detected by the V581 diagnostic\.](https://pvs-studio.ru/ru/blog/examples/v581/)
1. [Examples of errors detected by the V547 diagnostic\.](https://pvs-studio.ru/ru/blog/examples/v547/)