MISRA:在指向易失性对象的指针和整数类型之间进行转换?

Joh*_*Doe 0 c casting misra

我有以下代码部分:

----------header---------------------
typedef volatile struct REG_Base{
   a;
   b;
}REG_t

#define address (0xFFF45556)
------------------------------------

--------Source-----------------------

 LOCAL REG_t *pToREG;
 pToREG= (REG_t *) address;

-------------------------------------
Run Code Online (Sandbox Code Playgroud)

我在最后一行看到了 MISRA 消息“在指向易失性对象的指针和整数类型之间进行转换”。

知道如何避免此消息吗?

谢谢!

Lun*_*din 7

MISRA 有一个建议规则,禁止从整数转换为指针。其基本原理是他们关注在整数不能表示指针的情况下或在未对齐的情况下所涉及的定义不明确的行为。

这是过于迂腐的规则之一,它只是建议性的。大多数嵌入式系统都会偏离规则。


话虽如此,您的代码包含一些有问题的东西:

  • volatile 限定符不应是 typedef 的一部分。
  • ab声明没有任何意义,他们是某种丑陋的宏?
  • 将结构映射到物理地址是不可移植和安全的。该结构可能包含填充,地址可能未针对给定类型正确对齐。至少,您需要一些方法来确保没有结构填充,最好是静态断言。

另请注意,MISRA 要求将整数常量写为0xFFF45556u. 这不是一个坏主意,因为0xFFF45556is 是 type unsigned int,而例如0x7FFFFFFF是 signed int 类型。除非您小心,否则这些事情可能会导致与隐式类型提升相关的细微错误。