Power_s.Ch1 = ( (uint8)(((*RequestData)[0]) << 8 ) | ((*RequestData)[1]) );
-> 它抛出以下错误:
- 违反 MISRA 2004 要求的规则 12.8,移位运算符右侧的值超出范围
- 违反 MISRA 2004 要求的规则 10.1,复杂整数表达式的隐式转换
如何解决这个问题?
12.8 规定移位的右操作数必须低于左操作数的底层类型中的位数。如果 caseRequestData
是 type uint8_t*
,那么静态分析器会告诉您将 uint8_t 左移 8 位是没有意义的。如果RequestData
是其他类型,则静态分析器会损坏。
10.1 确实关注隐式整数类型提升。以下列方式修复您的代码:
uint8_t u8_result = (uint8_t)((*RequestData)[0] << SMALL_ENOUGH);
Power_s.Ch1 = (uint8_t)(u8_result | (*RequestData)[1]); // assuming Power_s.Ch1 is uint8_t.
几乎可以肯定,您必须像上面那样将表达式分成几行,否则会因为转换过多而无法阅读。
1.假设一个 u8 操作数,左移超过 7 位需要比 uint8 更宽的整数,在您的情况下,您将移动 8。
2.假设 Power_s.Ch1 为大于 uint8 的类型,存在从 unit8 到更高整数类型的隐式转换。
请检查整数提升和算术转换规则。在移位的情况下,通常一元转换分别应用于每个操作数,结果的类型是转换后的左操作数的类型。