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 из-за более позднего актерского состава.

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

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

Примеры

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

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