从INT16转换到无符号INT16可能溢出

问题描述 投票:0回答:2

Polyspace代码检查后我收到“从INT16到无符号INT16可能溢出的转换”。

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

如果该类型转换做的工作?据Polyspace没有:)

type-conversion unsigned signed misra
2个回答
0
投票

首先,您需要确保AnalogInputValue不包含任何负数键入强制转换为UINT16之前。如果你这样做OT这样做,那么你的风险在类型转换丢失数据。


0
投票

下面两行做同样的事情:

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它应当作出这种假设的一种手段。

© www.soinside.com 2019 - 2024. All rights reserved.