Почему я должен приводить элемент 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, чтобы получить официальный ответ и направить его поставщику.