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

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

Описание

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

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

Объяснение

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

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

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

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

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

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

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

Примеры

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

typedef int int32_t;
typedef unsigned int uint32_t;

void func() {
     uint32_t op1;
     uint32_t op2;
     int32_t res;

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

}

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

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

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

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

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

Введенный в R2013b