exponenta event banner

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

Значение составного выражения не должно быть отнесено к другой категории существенного типа или более широкому существенному типу.

Описание

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

Значение составного выражения не должно быть отнесено к другой категории существенного типа или более широкому существенному типу.

Объяснение

Составное выражение - это непостоянное выражение, использующее составной оператор. В модели основного типа составными операторами являются:

  • Мультипликативный (*, /, %)

  • Аддитивный (бинарный +, двоичный -)

  • Побитовый (&, |, ^)

  • Смена (<<, >>)

  • Условный (?, :)

Отливка на более широкий тип не допускается, поскольку результат может варьироваться в зависимости от реализаций. Рассмотрим это выражение:

(uint32_t) (u16a +u16b);
На 16-разрядной машине добавление выполняется в 16 битах. Результат сворачивается до его приведения к 32 битам. На 32-разрядной машине добавление происходит в 32 битах и сохраняет биты высокого порядка, которые теряются на 16-разрядной машине. Приведение к более узкому типу с той же самой категорией существенного типа допустимо, поскольку явное усечение результатов всегда приводит к одной и той же потере информации.

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

Внедрение Polyspace

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

Например, в этом примере нарушение показано в первом присвоении i но не второй. В первом назначении составное выражение i+1 непосредственно преобразуется из подписанного в неподписанный тип. Во втором назначении составное выражение сначала приводится к тому же типу, а затем результат приводится к другому типу.

typedef int int32_T;
typedef unsigned char uint8_T; 
...
...
int32_T i;
i = (uint8_T)(i+1); /* Noncompliant */
i = (uint8_T)((int32_T)(i+1)); /* Compliant */

Дополнительное сообщение в отчете

  • Значение составного выражения не должно быть отнесено к другой категории существенного типа.

  • Значение составного выражения не должно приравниваться к более широкому существенному типу.

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

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

Примеры

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

extern unsigned short ru16a, u16a, u16b;
extern unsigned int   u32a, ru32a;
extern signed int     s32a, s32b;

void foo(void)
{
  ru16a  = (unsigned short) (u32a + u32a);/* Compliant                           */
  ru16a += (unsigned short) s32a;    /* Compliant - s32a is not composite        */
  ru32a  = (unsigned int) (u16a + u16b);  /* Noncompliant - wider essential type */
}

В этом примере правило 10.8 нарушается в следующих случаях:

  • s32a и s32b по существу являются signed переменные. Однако результат ( s32a + s32b ) отливается по существу unsigned тип.

  • u16a и u16b по существу являются unsigned short переменные. Однако результат ( s32a + s32b ) отлит на более широкий существенный тип, unsigned int.

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

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