MISRA C++:2008 Rule 5-0-7

Не должно быть явных плавающих-интегральных преобразований выражения cvalue

Описание

Определение правила

Не должно быть явных плавающих-интегральных преобразований выражения cvalue.

Объяснение

Выражения, отмеченные этой проверкой, следуют подробным спецификациям для cvalue выражений из MISRA® Документация C++.

Если вы вычисляете выражение и позже приведете результат к другому типу, приведение не влияет на базовый тип оценки (самый широкий из типов данных операнда в выражении). Например, в этом примере результат целочисленного деления затем переводится в тип с плавающей точкой.

short num;
short den;
float res;
res= static_cast<float> (num/den);
Однако разработчик или рецензент кода могут ожидать, что оценка использует тип данных, к которому результат приведен позже. Например, можно ожидать деления с плавающей точкой из-за более позднего приведения.

Дополнительное сообщение в отчете

Не должно быть явных плавающих-интегральных преобразований выражения cvalue.

Комплексное выражение базового типа typeBeforeConversion можно привести только к более узкому целому типу с той же сигнальностью, однако тип назначения typeAfterconversion.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

void func() {
     short num;
     short den;
     short res_short;
     float res_float;
     
     res_float = static_cast<float> (num/den); //Noncompliant
     
     res_short = num/den;
     res_float = static_cast<float> (res_short); //Compliant

}

В этом примере первое приведение результата деления нарушает правило, но второе приведение не нарушает.

  • Первое приведение может привести к неправильному ожиданию того, что выражение вычисляется с базовым типом float.

  • Второе приведение дает понять, что выражение вычисляется базовым типом short. Результат затем приведен к типу float.

Проверяйте информацию

Группа: Выражения
Категория: Требуемая
Введенный в R2013b