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

  • + операция нарушает правило. Левый операнд чрезвычайно без знака, и правильный операнд подписывается.

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

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

Группа: существенная модель типа
Категория: необходимый
Категория AGC: консультация