我们正在使用启用 MISRA C 2004 检查器的 Parasoft 静态分析。
该软件是一个嵌入式系统。我们喜欢将常量描述如下:
[1] #define MOTOR_ON (1 << 9)
这将表明寄存器中的第 9 位应为 1 以打开电机。
该表达式未通过 MISRA,因此我们对其进行了更改:
[2] #define MOTOR_ON (1U << 9U)
这些更改转换为无符号整数常量,因为移位最好使用无符号整数完成。
语句 2 中的表达式仍然失败,因为需要检查右手运算符 (9U)。根据 MISRA,如果右手运算符大于左手运算符的底层类型的位宽,就会出现问题。
问题的根源在于 1U 的底层类型为unsigned char
8 位。
我们写入的寄存器是 16 位的,所以理论上没有问题。
如何更改 [2] 中的表达式以使其通过 MISRA C 2004,而不是使用强制转换?
我在 8/32 位模式下使用带有 ARM7TDMI 处理器的 IAR Embedded Workbench。
编辑 1:示例代码。
void turn_on_motor(void);
#define MOTOR_ON (1U << 9U)
void turn_on_motor(void)
{
uint16_t * const p_motor_control = (uint16_t *)(0x01234567U);
*p_motor_control = MOTOR_ON;
}
错误文本:用作移位运算符右手操作数的常数应受到限制。
来自 Parasoft 提供的 MISRA 规则文档:
Rule reports a violation if:
- the right-hand operand is a constant with negative value or with value that
exceeds the length (in bits) of the left-hand operand
- the right-hand operand is not a constant and is not checked by specific
pattern