PC-Lint错误将unsigned int值分配给uint32_t变量

时间:2013-09-18 16:24:33

标签: c embedded 32-bit uint32-t pc-lint

我有以下代码行:

uint32_t address = 0x40000000U;

使用au-misra2.lnt配置文件时,这会产生以下3个PC-Lint错误:

"*** LINT: "D:\_SVN\LPC1788-32 Dev Kit\Bootloader--4\Loadware\source\led.c"(7, 35) Note 960: Violates MISRA 2004 Required Rule 10.1, Implicit conversion of integer to smaller type"

"*** LINT: "D:\_SVN\LPC1788-32 Dev Kit\Bootloader--4\Loadware\source\led.c"(7, 35) Info 712: Loss of precision (initialization) (unsigned long to unsigned int)"

"*** LINT: "D:\_SVN\LPC1788-32 Dev Kit\Bootloader--4\Loadware\source\led.c"(7, 35) Warning 569: Loss of information (initialization) (31 bits to 16 bits)"

更改为:

uint32_t address = (uint32_t)0x40000000U;

分配值为0的结果。

为什么会这样?它适用于32位Cortex-M3处理器,所以这应该将unsigned int ..分配给unsigned int - 我无法理解为什么它不可接受。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

似乎PC-Lint配置为sizeof(int)等于2.您可以使用-si#选项将sizeof(int)指定给PC-Lint。例如,使用-si4指定int是4个字节。

另外,请确保PC-Lint使用正确的包含路径并包含正确版本的std_int.h。

答案 1 :(得分:0)

编译器可以使用16位指令而不是32位来保存代码大小。文字的默认大小为int,可能只有16位。 (我不确定。)转换错误可以在你投射之前来自文字本身。

尝试uint32_t address = 0x40000000UL;