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

时间:2016-04-11 14:54:06

标签: 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;

-------------------------------------

我在最后一行得到了MISRA消息" 在指向易失性对象的指针和整数类型"之间。

知道如何避免这条消息吗?

THX!

1 个答案:

答案 0 :(得分:3)

MISRA有一条禁止从整数到指针的强制转换的顾问规则。理由是它们关注的是在整数不能表示指针的情况下或者在未对齐的情况下涉及的定义不明确的行为。

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

话虽如此,您的代码包含一些可疑的内容:

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

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