Почему я должен приводить элемент enum при назначении ему того же типа переменной enum в C?

У меня есть следующее:

typedef enum
{
   FLS_PROG_SUCCESS,
   FLS_PROG_FAIL,
   FLS_ERASE_SUCCESS2U,
   FLS_ERASE_FAIL,
   FLS_READ_SUCCESS,
   FLS_READ_FAIL,
   FLS_FORMAT_SUCCESS,
   FLS_FORMAT_FAIL
}FLS_JobResult_t;

void Foo(void)
{
   FLS_JobResult_t ProgramStatus;

   /* Then I try to initialize the variable value */
   ProgramStatus = FLS_PROG_SUCCESS;

   ...
}

Невинно, но при компиляции MISRA C выдает ошибку:

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

И я узнал, что напишу инициализацию следующим образом:

ProgramStatus = (FLS_JobResult_t)FLS_PROG_SUCCESS;

И это не очень хорошо для меня выглядит, как будто MISRA хочет, чтобы я бросал броски во весь код, и это слишком.

Вы знаете, почему это? Я не думаю, что это должно быть проблемой, но я перепробовал все, что приходит мне в голову, и это был единственный способ избавиться от этой ошибки, но это просто не имеет никакого смысла, не так ли?

С уважением.

1 ответ

Решение

(Привет, это новый аккаунт, поэтому я пока не могу использовать раздел комментариев, чтобы запросить дальнейшие разъяснения, поэтому мой ответ может быть шире, чем нужно)

Основываясь на тексте предупреждающего сообщения, я предполагаю, что вы говорите о MISRA-C:2012 (новейший стандарт), который является значительным улучшением по сравнению с предыдущими, в том, что он приложил гораздо больше усилий для формулировки обоснования наряду со многими более совместимыми и совместимые примеры были добавлены. Это Правило 10.3. Обоснование таково: поскольку C позволяет автоматически выполнять присваивания между различными арифметическими типами, использование этих неявных преобразований может привести к непредвиденным результатам с возможностью потери значения, знака или точности.

Таким образом, MISRA-C: 2012 требует использования более строгой типизации, что обеспечивается его моделью основных типов, что снижает вероятность возникновения таких проблем.

К сожалению, многие инструменты не правильно реализовали правила и модель типов. В этом случае ваш инструмент неверен, это не является нарушением основных правил типа, потому что ProgramStatus а также FLS_PROG_SUCCESS оба одинакового необходимого типа. Фактически аналогичный пример показан в самом стандарте под списком совместимых примеров правила:

enum enuma { A1, A2, A3   } ena;
ena  = A1;

Если ваш поставщик инструментов не согласен, вы можете опубликовать свой вопрос на "официальном" форуме MISRA, чтобы получить официальный ответ и направить его поставщику.

Другие вопросы по тегам