MISRA C:2012 Rule 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 нарушает правило дважды.

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

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

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

Группа: Модель Essential Type
Категория: Требуемая
Категория СМЖЛ: Консультационная