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

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

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

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

Исключения:

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

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

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

    int func( int input )
    {
      short var;
      char *ptr;

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

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

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

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

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

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

    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` не является мёртвым кодом, поскольку содержит операции исключительно в недостижимом коде. Однако вызов функции — это мёртвый код, поскольку его удаление не меняет поведение программы.

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

    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);
    }

Данная диагностика классифицируется как:

CWE-561 MISRA-C-2023-2.2