5

以下代码在 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当我交换和时,为什么代码通过 MISRA 检查MyVariable

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

4

3 回答 3

6

MISRA 检查器中没有错误,它的行为正确。您收到此错误是因为 C 标准存在缺陷且不合逻辑。

有两个项目:

  • One是一个枚举常数。标准 §6.7.2.2/2 规定这应与 兼容int,没有例外。

  • MyVariable枚举类型。标准 §6.7.7.2/4 规定这应该与 char、有符号整数类型或无符号整数类型兼容。适用的类型是实现定义的行为。

在您的情况下,实现定义的枚举类型似乎等于 unsigned int。

所以代码试图隐式地将有符号整数的变量转换为无符号整数,这违反了 MISRA 2004 10.1。

符合 MISRA 的代码应该是if (One == (MyEnum)MyVariable).

于 2012-05-24T08:24:02.930 回答
0

我怀疑编译器在内部处理enumsas unsigned integer,只要enum.

于 2012-05-14T13:04:42.110 回答
-1

我会怀疑编译器错误。你用的是什么编译器?这篇文章提到了在使用 TI 的编译器时导致 Misra 10.1/R 失败的编译器错误。

于 2012-05-14T11:49:03.750 回答