如何隐式转换整数类型?

时间:2012-05-14 11:34:02

标签: c misra

以下代码在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;
}
  • 为什么逻辑表达式被转换?
  • 这里有什么转换?
  • 当我交换OneMyVariable时,为什么代码会通过MISRA检查?

编辑:编译器是TI“MSP430 C / C ++编译器v4.0.0”,包含MISRA规则检查。

3 个答案:

答案 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)

我怀疑编译器在内部处理enumsunsigned integer,只要enum中没有负值。

答案 2 :(得分:-1)

我怀疑是编译错误。你用的是什么编译器? This post提到了使用TI编译器时导致Misra 10.1 / R失败的编译器错误。