【问题标题】:Rule 10.1, Implicit conversion of complex integer expression规则 10.1,复整数表达式的隐式转换
【发布时间】:2015-01-12 05:28:39
【问题描述】:
Power_s.Ch1 = ( (uint8)(((*RequestData)[0]) << 8 ) | ((*RequestData)[1]) );

-> 抛出以下错误:

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

如何解决?

【问题讨论】:

  • 请格式化您的代码。
  • RequestData的类型是什么

标签: c lint misra


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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.
    

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

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2010-09-08
      • 2023-03-11
      • 2014-11-15
      • 2023-03-23
      相关资源
      最近更新 更多