2015-09-11 7 views
2

После перечисления определенной в моем кодепредупреждение MISRA-C во время инициализации перечислимого типа

typedef enum e_gpio_pin 
{ 
    GPIO_PIN_1 = 1,  /*!< pin 1 */ 
    GPIO_PIN_2,   /*!< pin 2 */ 
    GPIO_PIN_3,   /*!< pin 3 */ 
    GPIO_PIN_4,   /*!< pin 4 */ 
    GPIO_PIN_5,   /*!< pin 5 */ 
    GPIO_PIN_6,   /*!< pin 6 */ 
    GPIO_PIN_7,   /*!< pin 7 */ 
    GPIO_PIN_8,   /*!< pin 8 */ 
    GPIO_PIN_9,   /*!< pin 9 */ 
    GPIO_PIN_10,   /*!< pin 10 */ 
    GPIO_PIN_FIRST = GPIO_PIN_1, /*!< first pin */ 
    GPIO_PIN_LAST = GPIO_PIN_10 /*!< last pin */ 
} T_GPIO_PIN; 

Теперь ниже линии использовали для инициализации переменной.

static const T_GPIO_PIN ioPin = GPIO_PIN_9; 

и я получил предупреждение ниже

Выражение стоимости эфирного типа «По существу Enum» присваивается объекту эфирного типа «По существу ENUM» комментарий: MISRA 10,3 (C90-2012 req.)

У кого-нибудь есть идея, как я могу устранить это предупреждение?

+0

Правило Misra 10.3 говорит, что вы используете более узкий тип, но ваша инициализация прекрасна. – venki

+0

какой инструмент вы используете? LDRA? – venki

+2

Да, пожалуйста, напишите имя инструмента, чтобы они получили имя и пристыдили публично. Там так много дерьмовых анализаторов. – Lundin

ответ

3

Поскольку константа перечисления GPIO_PIN_9 принадлежит к T_GPIO_PIN ioPin, они оба имеют одинаковый тип «по существу перечислимого типа». Это объясняется в добавлении D.5 и D.6 MISRA-C: 2012. В терминах MISRA ваше перечисление является с именем enum (*) типа enum<i>, и его константы перечисления имеют один и тот же тип.

У вас возникнут проблемы, если вы попытаетесь присвоить перечисление некоторым значениям, которые являются перечисляющими константами другого типа перечисления. Я полагаю, что инструмент может запутаться, потому что вы оба использовали тег enum и typedef, возможно, он считает, что enum e_gpio_pin и T_GPIO_PIN ioPin - это различные типы перечислений.

Нет ничего плохого в вашем коде, насколько это касается MISRA. Устраните предупреждение, отправив отчет об ошибке своему поставщику инструмента. Обход для инструментальной ошибки может заключаться в удалении тега enum.


(*) См приложение Г.5

Именованная перечисление является перечислением, которое имеет тег или который используется в определении любого объекта, функции или типа;

+1

Я бы сказал обратное: обходным путем для инструментальной ошибки будет удаление typedef и использование тега. – user3386109

+0

@ user3386109 Любой тег или typedef должен сделать его именем enum. Я добавил цитату из приложения D выше. – Lundin