﻿# V2658\. MISRA\. Dead code should not be used in a project\.

Диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для языка C\.

В программе не должен содержаться мёртвый код\. Под этим подразумевается код, удаление которого не меняет видимого поведения программы\.

Наличие такого кода указывает на ошибку в логике программы, а также усложняет её понимание и отладку\.

**Исключения:**

* недостижимый код не является мёртвым, так как он не может быть выполнен;
* неиспользуемая проинициализированная переменная не считается мёртвым кодом, так как инициализация не является операцией присваивания;
* преобразование к `void` типу, результат которого не используется, не является мёртвым кодом, так как это указывает на значение, которое намерено не используется;
* оператор приведения типов, результат которого используется\.

**Примечание\. **Компилятор имеет право удалить мёртвый код, так как это не повлияет на видимое поведение программы\.

Рассмотрим пример избыточных операций:

```cpp
int func( int input )
{
  short var;
  int *ptr = &input;

  var = 11;     // <=
  (int)var;     // <=
  var + input;  // <=
  *ptr++;       // <=
  return input + input;
}
```

В приведённом примере есть несколько операций: присваивание \(`=`\), приведение типа \(`(int)`\), сложение \(`+`\), инкремент указателя `ptr`, а также его разыменование \(`*`\)\. Они являются избыточными, так как результат вычисления этих операций не используется и не влияет на выполнение программы\.

Корректный код:

```cpp
int func( int input )
{
  short var;
  int *ptr;

  ptr = &input;
  var = 11;
  input += (int)var;
  (*ptr)++;
  return input;
}
```

Рассмотрим пример избыточного вызова функции:

```cpp
void funcToCall ( int input )
{
  return;
  for(size_t i = 0; i < 13; ++i)
  {
    input += i;
  }
}

int funcBase ( int input ) 
{
  funcToCall(input);
  return input + input;
}
```

Функция `funcToCall` не является мёртвым кодом, поскольку содержит операции исключительно в недостижимом коде\. Однако вызов функции — это мёртвый код, поскольку его удаление не меняет поведение программы\.

Пример корректного кода:

```cpp
unsigned int funcToCall ( unsigned int x )
{
  for(size_t i = 0; i < 13; ++i)
  {
    x += i;
  }
  return x;
}

unsigned int funcBase ( unsigned int x )
{
  return funcToCall(x);
}
```