【问题标题】:MISRA-C warning during initialization enum type初始化枚举类型期间的 MISRA-C 警告
【发布时间】:2015-09-11 06:04:14
【问题描述】:

按照我的代码中定义的枚举

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' 分配给基本类型的对象 “本质上是枚举”评论:MISRA 10.3 (C90-2012 req.)

有人知道我该如何解决这个警告吗?

【问题讨论】:

  • Misra 10.3 规则说转换为较窄的类型,但您的初始化很好。
  • 是的,请发布工具名称,以便他们在公共场合被点名和羞辱。那里有很多糟糕的分析器。
  • @user3386109 这里没有匿名枚举,怎么是重复的?
  • @user3386109 T_GPIO_PIN 是匿名枚举吗?
  • @user3386109 enum e_gpio_pin 是匿名枚举吗?

标签: c enums misra


【解决方案1】:

由于枚举常量GPIO_PIN_9 属于T_GPIO_PIN ioPin,它们都具有相同的“本质上是枚举”类型。 MISRA-C:2012 附录 D.5 和 D.6 对此进行了解释。在 MISRA 术语中,您的枚举是enum&lt;i&gt; 类型的命名枚举(*),它的枚举常量属于同一类型。

如果您尝试为枚举分配一些值,这些值是另一种枚举类型的枚举常量,您只会遇到问题。我想该工具可能会感到困惑,因为您都使用了枚举标记和 typedef,也许它认为 enum e_gpio_pinT_GPIO_PIN ioPin 是不同的枚举类型。

就 MISRA 而言,您的代码没有任何问题。通过向您的工具供应商发布错误报告来解决警告。该工具错误的解决方法可能是删除枚举标记。


(*) 见附录 D.5

命名枚举类型是具有标签或被使用的枚举 在任何对象、函数或类型的定义中;

【讨论】:

  • 我会说相反:工具错误的解决方法是删除 typedef,并使用标签。
  • @user3386109 tag 或 typedef 应该使它成为一个命名枚举。我在上面的附录 D 中添加了一个引用。
猜你喜欢
  • 2014-08-02
  • 2011-10-21
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2011-05-23
  • 2021-01-23
相关资源
最近更新 更多