规则10.1,复数整数表达式的隐式转换

时间:2015-01-12 05:28:40

标签: c lint misra

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

- &GT;它抛出以下错误:

  1. 违反MISRA 2004规则12.8,超出班次右侧的界限值  操作
  2. 违反MISRA 2004要求规则10.1,复数整数的隐式转换  表达
  3. 如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

1.假设一个u8操作数,左移7bit以上需要一个比uint8更宽的整数,在你的情况下你要移8。

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

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

答案 1 :(得分:0)

12.8表示移位的右操作数必须低于左操作数的基础类型中的位数。如果RequestData的类型为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.

你几乎肯定要像上面那样在几行中打破这种表达,否则因为很多演员而无法理解。