exponenta event banner

MISRA C++: 2008 Правило 5-0-9

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

Описание

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

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

Объяснение

Выражения, отмеченные этой проверкой, соответствуют подробным спецификациям выражений значений из документации 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