【问题标题】:How are integer types converted implicitly?整数类型是如何隐式转换的?
【发布时间】:2012-05-14 11:34:01
【问题描述】:

以下代码在 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++ Compiler v4.0.0”,包含 MISRA 规则检查。

【问题讨论】:

  • 我已经对这个 MISRA 东西有不好的看法。你所做的一切都很好。
  • 我支持编译器错误假设
  • 它是否对if (MyVariable == One) {} 产生相同的错误/警告?
  • @wildplasser 请阅读我的问题的最后一句话。
  • 糟糕。我只阅读代码,所以看起来;-)

标签: c misra


【解决方案1】:

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)

【讨论】:

  • “标准”是C标准吗?如果 MyVariable 是 unsigned int,为什么我交换 One 和 MyVariable 时检查成功?
  • @harper 是的,C 标准 ISO 9899:2011(C90 相同)。好吧,那么交换肯定是一个错误,无论您使用哪种顺序,它都会给您一个错误。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 链接中的错误指的是另一个问题。这与失败的 MISRA 检查相同,但它用于错误地处理数组元素。它与枚举和变量的顺序无关。
    • 我知道。我刚刚提到它是由于编译器错误而失败的 Misra 检查的示例。
    • 这是 TI 确认的错误。
    • 这与问题完全无关。
    • 我们已经同意了。你想说啥? @harper 接受了答案,我认为这意味着我的怀疑是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多