我正在使用带有 MISRA C:2004 检查的 IAR Workbench 编译器。
片段是:
#define UNS_32 unsigned int
UNS_32 arg = 3U;
UNS_32 converted_arg = (UNS_32) arg;
/* Error line --> */ UNS_32 irq_source = (UNS_32)(1U << converted_arg);
MISRA 错误是: 错误[Pm136]:从基础 MISRA 类型“unsigned char”到“unsigned int”的非法显式转换(MISRA C 2004 规则 10.3)
我在上面的任何代码中都没有看到任何unsigned char
内容。
讨论为什么 Misra 会在这里抛出错误?讨论了可能具有与左移不同的提升规则的乘法。
我的理解是编译器应该将表达式提升为更大的数据类型,而不是降级为更小的数据类型。
这里到底发生了什么?
如何使代码符合 MISRA C:2004?
编辑1:
将错误行更改为:
UNS_32 irq_source = (UNS_32)((UNS_32) 1U << converted_arg);
不会使错误消失。