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

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

С уважением.


person m4l490n    schedule 30.07.2015    source источник
comment
Как предполагает @Veriloud, это ошибка инструмента, а не нарушение кода.   -  person Andrew    schedule 06.08.2015


Ответы (1)


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

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

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

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

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

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

person Veriloud    schedule 31.07.2015
comment
Большое тебе спасибо. Я так и думал, но не был уверен. Поскольку я новичок в правилах MISRA-C, я подумал, что, возможно, что-то действительно не так. Также я думаю, что у моего инструмента есть проблемы с другими правилами, потому что мне тяжело с такими вещами. Не могли бы вы взглянуть на его другой вопрос, пожалуйста, я буду очень признателен. stackoverflow.com /вопросы/31726911/ - person m4l490n; 31.07.2015
comment
Не за что - думаю, я могу прокомментировать свой ответ ;-), я посмотрел на другой вопрос и ответил. Разрешите спросить, что это за инструмент? Поскольку Правило 10.3 является общим правилом, инструмент должен более четко указывать, какая часть правила, по его мнению, нарушается. - person Veriloud; 01.08.2015
comment
Инструмент представляет собой TriCore Eclipse IDE v5.0r2. - person m4l490n; 03.08.2015