Значение составного выражения не должно быть брошено к различной существенной категории типа или более широкому существенному типу
Значение составного выражения не должно быть брошено к различной существенной категории типа или более широкому существенному типу.
Составное выражение является непостоянным выражением с помощью составного оператора. В Существенной Модели Типа составные операторы:
Мультипликативный (*
, /
, %
)
Дополнение (бинарный +
двоичный файл-
)
Поразрядно (&
, |
, ^
)
Сдвиг (<<
, >>
)
Условное выражение (?
, :
)
Унарные операторы, такие как ~
и унарный +
или -
также рассматриваются составными операторами.
Кастинг к более широкому типу не разрешен, потому что результат может варьироваться между реализациями. Рассмотрите это выражение:
(uint32_t) (u16a +u16b);
Для получения дополнительной информации о существенных типах смотрите MISRA C:2012 Rule 10.1
.
Средство проверки правила повышает дефект, только если результат составного выражения брошен к различному или более широкому существенному типу. Унарные операторы не рассматриваются как составные операторы.
Например, в этом примере, нарушение показывают в первом присвоении на 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 */
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: существенная модель типа |
Категория: необходимый |
Категория AGC: консультация |