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' может быть удалена компилятором.
Данная диагностика классифицируется как:
|