【问题标题】:Conversion from int16 to unsigned int16 may overflow从 int16 到 unsigned int16 的转换可能会溢出
【发布时间】:2019-06-26 00:57:59
【问题描述】:

在 Polyspace 代码检查后,我收到“从 int16 到 unsigned int16 的转换可能会溢出”。

uint16 lData = 0x00u;
sint16 AnalogInputValue;
lData = (uint16)AnalogInputValue; => This line causes Polyspace error

类型转换应该完成这项工作吗?根据 Polyspace 没有:)

【问题讨论】:

  • 为什么你首先有一个带符号的变量“analoginputvalue”?这没有任何意义。
  • 这些只是选定的行。有符号的变量在函数调用等之后用有符号的值填充......为了简单起见,只复制了这些行......

标签: type-conversion unsigned signed misra


【解决方案1】:

以下两行做同样的事情:

lData = AnalogInputValue;
lData = (uint16)AnalogInputValue;

为什么?赋值lData 的目标是uint16 类型,因此无论哪种情况,变量AnalogInputValue 中存储的值都必须转换为uint16。然而,变量AnalogInputValue 的类型是sint16

警告来自以下事实:uint16 类型的变量可以保存 0..65535 范围内的值。但是,sint16 类型的变量通常可以保存 -32768..32767 范围内的值。因此,如果AnalogInputValue 恰好包含-32768..-1 范围内的值,则该值不能用uint16 表示。

因此,在进行赋值之前,您可以在其周围添加一些代码来检查 AnalogInputValue 是否为负数。这意味着,它的值是 0..32767。所有这些值都可以用uint16 表示。并且,对于另一种情况,即检查显示AnalogInputValue 恰好是否定的,您必须找到一些可接受的解决方案。

这里有第三种可能的情况:您 100% 确定 AnalogInputValue 永远不会保持负值,但逻辑太复杂,Polyspace 无法推断出这一事实,或者数据来自外部来源(这里似乎是这种情况,因为该值称为AnalogInputValue)。然后,在赋值之前添加一个断言可以用来指示 Polyspace 它应该做出这个假设。

【讨论】:

    【解决方案2】:

    在将 AnalogInputValue 类型转换为 uint16 之前,您首先需要确保它不包含任何负数。如果您不这样做,那么您可能会丢失类型转换中的数据。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2020-11-02
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      相关资源
      最近更新 更多