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