首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MISRA违规规则10.1和枚举

MISRA违规规则10.1和枚举
EN

Stack Overflow用户
提问于 2012-05-15 03:17:10
回答 3查看 10.7K关注 0票数 0

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

编译器不会生成MISRA错误,但静态分析工具会生成。我和工具制造商有一张罚单正在处理中。

给定:

代码语言:javascript
复制
#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违规:

代码语言:javascript
复制
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.

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-10 03:18:28

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

代码语言:javascript
复制
typedef enum Colors {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE} Colors_t;  

是一个signed int

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

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

代码语言:javascript
复制
Colors_t my_color;
if (my_color == BLUE) // This generates a MISRA violation.

signed char相比,这种违规行为是signed int的。

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

代码语言:javascript
复制
typedef enum Tree_Species {REDWOOD, CYPRUS, PALM, OAK, JUNIPER, SEGUARO} Tree_Species_t;
Tree_Species_t my_tree;
my_tree = BLUE;
票数 7
EN

Stack Overflow用户

发布于 2012-05-15 05:02:38

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-10-11 05:16:39

这很可能是my_color声明的结果

代码语言:javascript
复制
enum Color my_color;

尝试从以下内容中删除'enum‘:

代码语言:javascript
复制
Color my_color;

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10589684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档