【发布时间】:2017-03-15 15:20:08
【问题描述】:
在一个针对 16 位处理器的程序中,在一个巨大的宏中,以下代码(简化)多次出现:
typedef unsigned short int uint16_t;
uint16_t var;
var = ~0xFFFF;
MISRA 抱怨警告 12.4:整数转换导致截断。用于实现此目的的工具是 Coverity。
我已经查看了论坛,但我确实需要一个解决方案(而不是通过实际值更改否定),因为该行位于具有不同参数的宏中。
我尝试了很多东西,这是最后一次失败的尝试:
var = (uint16_t)((~(uint16_t)(0xFFFFu))&(uint16_t)0xFFFFu);
(值0xFFFF只是一个例子。在实际代码中,该值是一个变量,可以取任何值(但16位))
请问你还有什么想法吗?谢谢。
编辑:
然后我尝试使用 32bits 值,结果与以下代码相同:
typedef unsigned int uint32_t;
uint32_t var;
var = (uint32_t)(~(uint32_t)(0xFFFF0000u));
【问题讨论】:
-
你可以使用
var = 0; -
在你的实际代码中,你真的有
~0xffff吗?你知道~0xffff等于0? -
var = ~0xFFFF;会收到警告,但var = ~(uint16_t)0xffff;不会。 -
谢谢。但是我从静态分析工具(Coverity)收到 MISRA 警告。我的编译器也没有发出警告,但 Coverity 会发出警告。
标签: c truncate misra coverity negation