MISRA 错误 10.1 复数的隐式转换

MISRA error 10.1 Implicit conversion of complex integer

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

check_Val = ( ~( 0x000Fu << Src_Data ) ); //where Src_Data is uint8 and check_Val is uint32.

我分析错误

Violates MISRA 2004 Required Rule 10.1, Implicit conversion of complex integer expression

因为 check_Val 是 uint32,Lf 应该适合它。那为什么会报错。

规则 10.1 涉及整数的隐式提升,通过使用 "underlying type" 的 MISRA:2004 概念,即表达式的预期类型。这是一个导致大量多余转换的奇怪概念,已在 MISRA:2012.

中修复

表达式的基础类型是整型文字 0x000Fu。对于整数文字,它指出基础类型是能够表示对象的最小可能类型(请参阅第 40-41 页)。所以 0x000Fu 的底层类型将是 uint8_t,因为它可以容纳一个字节,并且是无符号类型。

尽管如此,就 C 语言和编译器而言,整数文字实际上是 unsigned int 类型,并且不会发生任何提升。 MISRA: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,其中这些规则已得到澄清,并且 "underlying type" 概念已被一个不会导致这么多毫无意义的转换的概念所取代。