【问题标题】:MISRA Violation Rule 10.1 and EnumsMISRA 违反规则 10.1 和枚举
【发布时间】:2012-05-14 19:17:10
【问题描述】:

首先,这类似于:How are integer types converted implicitly?,但带有不同的 MISRA 警告。

编译器不会生成 MISRA 错误,但静态分析工具会生成。我正在处理工具制造商的票。

给定:

#include <stdio.h>
enum Color {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE};

int main(void)
{
  enum Color my_color;
  my_color = BLUE;
  if (my_color == YELLOW)  // Generates MISRA violation, see below.
  {
     printf("Color is yellow.\n");
  }
  else
  {
     printf("Color is not yellow.\n");
  }
  return 0;
}

静态分析工具正在为 if 语句生成 MISRA 违规:

MISRA-2004 Rule 10.1 violation: implicitly changing the signedness of an expression.
Converting "4", with underlying type "char" (8 bits, signed),
to type "unsigned int" (32 bits, unsigned) with different signedness.

编译器是否正确(未识别缺陷)或静态分析工具?

【问题讨论】:

  • 同样的代码,同样的错误,你的错误报告只是有点冗长。我看不出你的代码 sn-ps 有什么区别。
  • 我很想知道你从你的工具供应商那里得到了什么回复,但这看起来工具坏了。

标签: c enums misra


【解决方案1】:

根据 C 语言规范,表达式的类型:

typedef enum Colors {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE} Colors_t;  

signed int

同样根据语言,枚举项的值是可以包含整个枚举的最小单位。所以在上面的枚举中,BLUE 的类型为signed char

Colors_t 的变量与BLUE 进行比较时,静态分析工具会报告 MISRA 违规:

Colors_t my_color;
if (my_color == BLUE) // This generates a MISRA violation.

signed char相比,违规是signed int

此外,枚举项可以与其他枚举类型混合而不会出错,因为枚举不是唯一类型

typedef enum Tree_Species {REDWOOD, CYPRUS, PALM, OAK, JUNIPER, SEGUARO} Tree_Species_t;
Tree_Species_t my_tree;
my_tree = BLUE;

【讨论】:

    【解决方案2】:

    似乎有人(您的编译器或静态工具)认为您的枚举与 int 的大小和/或签名不同。

    我的 Green Hills 编译器有一个选项 --short-enum(对 Enum 使用最小的类型),它将为上面的示例选择 char 类型。你的编译器有这样的选择吗?是否启用?编译器是否默认枚举为“非标准”值?

    根据我的经验,默认情况下,静态工具默认情况下很好地遵循语言规范,这意味着它应该期望枚举为 int 大小。 (请参阅此链接以供参考:What is the size of an enum in C?)。由于大多数静态工具会窥探您的编译器命令行使用情况,因此您的编译时选项可能会让静态分析器相信您的枚举小于 ints

    我建议彻底检查您的编译器和静态分析器文档以解决冲突。密切关注您的构建过程(编译时选项、默认值等)。

    【讨论】:

      【解决方案3】:

      很可能是my_color声明的结果

      enum Color my_color;
      

      尝试从中删除“枚举”:

      Color my_color;
      

      静态分析器可能认为您声明了一个单独的枚举,因此违反了 10.1。 由于它是另一种类型,因此 MISRA 规则禁止将一种类型分配给另一种类型。

      【讨论】:

      • -1 呃?这是 C,不是 C++。在enum Color {A, B, C}; 之后没有定义名为Color 的类型(我相信在C++ 中会有)。
      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多