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

C MISRA:在指向易失性对象的指针和整数类型之间强制转换?,c,casting,misra,C,Casting,Misra,我有以下代码部分: ----------header--------------------- typedef volatile struct REG_Base{ a; b; }REG_t #define address (0xFFF45556) ------------------------------------ --------Source----------------------- LOCAL REG_t *pToREG; pToREG= (REG_t *) a

我有以下代码部分:

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

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

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

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

-------------------------------------
在最后一行中,我得到了指向volatile对象的指针和整数类型之间的MISRA消息

你知道如何避免这个信息吗


谢谢

MISRA有一条建议规则,禁止从整数到指针的强制转换。其基本原理是,如果整数不能表示指针,或者如果未对齐,它们会涉及定义不当的行为

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

也就是说,您的代码包含一些可疑的内容:

volatile限定符不应是typedef的一部分。 a和b声明没有任何意义,它们是某种丑陋的宏吗? 将结构映射到物理地址既不可移植也不安全。结构可能包含填充,给定类型的地址可能没有正确对齐。至少,您需要一些方法来确保没有结构填充,最好是静态断言。
还要注意,MISRA要求将整数常量写入0xFFF45556u。这不是一个坏主意,因为0xFFF45556的类型是unsigned int,而例如0x7FFFFFFF的类型是signed int。除非小心,否则这些可能会导致与隐式类型提升相关的细微错误。

不要在指向volate对象的指针和整数类型之间转换。我对MISRA不是很熟悉,但你可能只是做了一些它不允许做的事情。注意:1本地2的post定义应该删除typedef,IMO中的volatile。然后根据需要显式使用volatile。也许然后pToREG=volatile REG_t*地址;将正常工作。此结构一开始看起来不像有效的C。什么是a;及b ;;,丑陋的宏?我在MISRA中看到了描述,但是这种类型的操作在必须寻址内存映射I/O端口的嵌入式软件应用程序中并不少见。这代表了我的情况。a和b声明只是伪声明,实际上不在生产代码中。非常感谢。