我有以下代码行:
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 - 我无法理解为什么它不可接受。
有没有人有任何想法?
答案 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;