2

私のコードで定義された次の列挙型

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;

そして、私は警告を下回りました

エッセンシャル タイプ 'Essentially Enum' の式の値は、エッセンシャル タイプ 'Essentially Enum' のオブジェクトに割り当てられます コメント: MISRA 10.3 (C90-2012 req.)

この警告を解決する方法を知っている人はいますか?

4

1 に答える 1

3

列挙定数GPIO_PIN_9はに属しているためT_GPIO_PIN ioPin、どちらも同じ「本質的に列挙型」の型を持っています。これについては、MISRA-C:2012 付録 D.5 および D.6 で説明されています。MISRA 用語では、列挙型は型の名前付き列挙型 (*) でenum<i>あり、その列挙定数は同じ型です。

別の列挙型の列挙定数であるいくつかの値を列挙型に割り当てようとした場合にのみ、問題が発生します。列挙型タグと typedef の両方を使用したため、ツールが混乱する可能性があると思います。おそらく、enum e_gpio_pinT_GPIO_PIN ioPinは異なる列挙型であると考えています。

MISRA に関する限り、コードに問題はありません。ツール ベンダーにバグ レポートを投稿して、警告を解決します。ツールのバグの回避策は、enum タグを削除することです。


(*) 付録 D.5 を参照

名前付き列挙型は、タグを持つか、任意のオブジェクト、関数、または型の定義で使用される列挙です。

于 2015-09-11T06:26:35.573 に答える