# V2594. MISRA. Controlling expressions should not be invariant.

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

Это правило актуально только для C. Контролирующее выражение в управляющих конструкциях 'if', '?:', 'while', 'for', 'do', 'switch' не должно быть инвариантно, то есть не должно всегда приводить к выполнению одной и той же ветки кода. Если контролирующее выражение содержит инвариантное значение, то это может свидетельствовать о программной ошибке. Любой код, который недостижим из-за инвариантного выражения, может быть удалён компилятором. Выражения, содержащие 'volatile'-переменные, не являются инвариантными.

Исключения:

- циклы 'do' с контролирующим выражением сущностного 'Boolean' типа, которое вычисляется как '0';
- инварианты, которые используются для создания бесконечных циклов.

Примечание. Допустимыми инвариантами для создания бесконечных циклов считаются:

- литералы сущностного 'Boolean' типа: '1' или 'true' (C99);
- приведение константного литерала '1' к сущностному 'Boolean' типу (например, '(bool) 1');
- цикл 'for' без контролирующего выражения.

Рассмотрим пример:

    void adjust(unsigned error)
    {
      if (error < 0)
      {
        increase_value(-error);
      }
      else
      {
        decrease_value(error);
      }
    }

В данном примере допущена ошибка: из-за того, что функция принимает беззнаковое число, результат проверки условия всегда будет ложным. В результате всегда будет вызываться только функция 'decrease_value', а ветка кода с вызовом функции 'increase_value' может быть удалена компилятором.

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

MISRA-C-2012-14.3 MISRA-C-2023-14.3