以下代码在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;
}
One
和MyVariable
时,为什么代码会通过MISRA检查?编辑:编译器是TI“MSP430 C / C ++编译器v4.0.0”,包含MISRA规则检查。
答案 0 :(得分:6)
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)
。
答案 1 :(得分:0)
我怀疑编译器在内部处理enums
为unsigned integer
,只要enum
中没有负值。
答案 2 :(得分:-1)
我怀疑是编译错误。你用的是什么编译器? This post提到了使用TI编译器时导致Misra 10.1 / R失败的编译器错误。