Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V2594. MISRA. Controlling expressions should not be invariant.

23 Июн 2021

Данное диагностическое правило основано на руководстве 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-14.3