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_short = static_cast<float> (res_float); //Compliant

}

В этом примере первые набирают результат деления, нарушает правило, но второй бросок не делает.

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

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

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

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

Введенный в R2013b