MISRA C ++:2008 правил 5-0-8

Явное интегральное или преобразование с плавающей точкой не должно увеличивать размер базового типа cvalue выражения

Описание

Управляйте определением

Явное интегральное или преобразование с плавающей точкой не должно увеличивать размер базового типа cvalue выражения.

Объяснение

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

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

short op1;
short op2;
int res;
res= static_cast<int> (op1 + op2);
Однако разработчик или рецензент кода могут ожидать, что оценка использует тип данных, к которому результат брошен позже. Например, можно ожидать сумму с базовым типом int из-за более позднего броска.

Обменивайтесь сообщениями в отчете

Явное интегральное или преобразование с плавающей точкой не должно увеличивать размер базового типа cvalue выражения.

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

void func() {
     short op1;
     short op2;
     int res;

     res = static_cast<int> (op1 + op2); //Noncompliant
     res = static_cast<int> (op1) + op2; //Compliant

}

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

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

  • Второй бросок сначала преобразовывает один из операндов к int так, чтобы сумма была на самом деле оценена с базовым типом int.

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

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

Введенный в R2013b