-1
Power_s.Ch1 = ( (uint8)(((*RequestData)[0]) << 8 ) | ((*RequestData)[1]) );

-> 它抛出以下错误:

  1. 违反 MISRA 2004 要求的规则 12.8,移位运算符右侧的值超出范围
  2. 违反 MISRA 2004 要求的规则 10.1,复杂整数表达式的隐式转换

如何解决这个问题?

4

2 回答 2

0

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.

几乎可以肯定,您必须像上面那样将表达式分成几行,否则会因为转换过多而无法阅读。

于 2015-01-12T07:31:02.513 回答
0

1.假设一个 u8 操作数,左移超过 7 位需要比 uint8 更宽的整数,在您的情况下,您将移动 8。

2.假设 Power_s.Ch1 为大于 uint8 的类型,存在从 unit8 到更高整数类型的隐式转换。

请检查整数提升和算术转换规则。在移位的情况下,通常一元转换分别应用于每个操作数,结果的类型是转换后的左操作数的类型。

于 2015-01-12T06:11:18.567 回答