exponenta event banner

MISRA C:2012 Правило 10.4

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

Описание

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

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

Объяснение

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

Дополнительные сведения об основных типах см. в разделе MISRA C:2012 Rule 10.1.

Внедрение Polyspace

Средство проверки вызывает нарушение этого правила, если два операнда операции имеют разные основные типы. В сообщении средства проверки указываются типы, обнаруженные на двух сторонах операции.

Проверка не вызывает нарушения этого правила:

  • Если один из операндов является постоянным нулем.

  • Если один из операндов является константой со знаком, а другой операнд не подписан, и константа со знаком имеет то же представление, что и его беззнаковый эквивалент.

    Например, оператор u8b = u8a + 3;, где u8a и u8b являются unsigned char переменные, не нарушают правило, поскольку константы 3 и 3U имеют такое же представление.

Поиск неисправностей

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

Примеры

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

#define S64_MAX (9223372036854775807LL)
#define S64_MIN (-9223372036854775808LL)
long long input_s64_a, input_s64_b, result_s64;

void my_func(void){
   if (input_s64_a < S64_MIN + input_s64_b) { //Noncompliant: 2 violations
      result_s64 = S64_MIN;
   }
}

В этом примере тип S64_MIN является по существу неподписанным. Стоимость 9223372036854775808LL на единицу больше наибольшего значения, которое может быть представлено 64-разрядной переменной. Поэтому значение переполняется, и результат оборачивается к отрицательному значению, поэтому -9223372036854775808LL является по существу неподписанным.

Операция input_s64_a < S64_MIN + input_s64_b дважды нарушает правило.

  • + операция нарушает правило. Левый операнд по существу не подписан, а правый операнд подписан.

  • < операция также нарушает правило. В результате повышения типа, результат + операция по существу не подписана. Теперь, левый операнд < операция по существу подписана, но правильный операнд по существу не подписан.

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

Группа: Модель основного типа
Категория: Обязательно
СМЖЛ Категория: Консультативные услуги