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

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

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

Исключения:

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

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

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

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

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

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