我正在根据MISRA规则编写代码。我收到以下表达式的错误MISRA
check_Val =(〜(0x000Fu<< Src_Data)); //其中Src_Data是uint8,check_Val是uint32。
我分析了错误
违反MISRA 2004要求规则10.1,复杂整数表达式的隐式转换
由于check_Val为uint32
,因此Lf应该适合它。然后它为什么会出错。
答案 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;概念已被一个不会导致如此多无意义演员阵容的概念所取代。