MISRA错误10.1复数整数的隐式转换

时间:2015-10-05 13:48:03

标签: c lint misra pc-lint

我正在根据MISRA规则编写代码。我收到以下表达式的错误MISRA

  

check_Val =(〜(0x000Fu<< Src_Data));   //其中Src_Data是uint8,check_Val是uint32。

我分析了错误

  

违反MISRA 2004要求规则10.1,复杂整数表达式的隐式转换

由于check_Val为uint32,因此Lf应该适合它。然后它为什么会出错。

1 个答案:

答案 0 :(得分:3)

规则10.1涉及使用MISRA:2004概念"基础类型"来隐式推广整数,即表达式的预期类型。这是一个奇怪的概念,导致众多多余的演员,这已在MISRA:2012修复。

表达式的基础类型是整数文字0x000Fu的类型。对于整数文字,它声明底层类型是能够表示对象的最小可能类型(参见p40-41)。因此0x000Fu的基础类型将是uint8_t,因为它可以放在一个字节中,并且它是无符号类型。

尽管就C语言和编译器而言,整数文字实际上是unsigned int类型,并且不会发生促销。米斯拉:2004年不在乎。

这意味着您必须在操作之前将操作数强制转换为uint32_t(绕过规则10.1)或在操作之后将操作数转换为uint8_t(关于转换的状态10.1和10.5)。我建议你把它投到uint32_t来摆脱这个问题。

固定代码应该是

check_Val = ~( (uint32_t)0x000Fu << Src_Data );

此外,由于移位运算符的两个操作数都是整数提升的,因此右侧运算符也会隐式提升为int。这种促销永远不会造成伤害,我不确定它是否违反了MISRA,但我认为它也可能引起警告。在这种情况下,您还必须转换正确的操作数:

check_Val = ~( (uint32_t)0x000Fu << (uint32_t)Src_Data );

我建议使用MISRA:2012,如果可能的话,这些规则已经澄清,并且基础类型为&#34;概念已被一个不会导致如此多无意义演员阵容的概念所取代。

相关问题