0

首先,这类似于:整数类型如何隐式转换?但有不同的 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.

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

4

3 回答 3

7

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

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

是一个signed int

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

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

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

将违规signed int与 进行比较signed char

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

typedef enum Tree_Species {REDWOOD, CYPRUS, PALM, OAK, JUNIPER, SEGUARO} Tree_Species_t;
Tree_Species_t my_tree;
my_tree = BLUE;
于 2012-11-09T19:18:27.890 回答
0

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

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

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

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

于 2012-05-14T21:02:38.433 回答
-1

很可能是声明的结果my_color

enum Color my_color;

尝试从中删除“枚举”:

Color my_color;

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

于 2012-10-10T21:16:38.787 回答