以下代码在MISRA检查中失败.具体的错误消息是:
(MISRA-C:2004 10.1/R)如果不是转换为相同签名的更宽整数类型,则整数类型表达式的值不应隐式转换为不同的基础类型.
typedef enum _MyEnum { One, Two } MyEnum;
MyEnum MyVariable;
int foo(void)
{
int result = 1;
if (One == MyVariable) // fails here with MISRA-C:2004 10.1/R
{
result = 2;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
One和MyVariable?编辑:编译器是TI"MSP430 C/C++编译器v4.0.0",包含MISRA规则检查.
MISRA检查器中没有错误,它的行为正确.你得到这个错误,因为C标准有缺陷且不合逻辑.
有两个项目:
One是一个枚举常量.标准§6.7.2.2/ 2规定,这应与之相容int,无例外.
MyVariable是枚举类型.标准§6.7.7.2/ 4规定这应该与char,有符号整数类型或无符号整数类型兼容.适用的类型是实现定义的行为.
在您的情况下,实现定义的枚举类型似乎等于unsigned int.
因此代码试图将signed int的变量隐含地转换为unsigned int,这违反了MISRA 2004 10.1.
符合MISRA标准的代码应该是if (One == (MyEnum)MyVariable).