MISRA:Cast 在指向 volatile 对象的指针和整数类型之间?
MISRA:Cast between a pointer to volatile object and an integral type?
我有以下代码部分:
----------header---------------------
typedef volatile struct REG_Base{
a;
b;
}REG_t
#define address (0xFFF45556)
------------------------------------
--------Source-----------------------
LOCAL REG_t *pToREG;
pToREG= (REG_t *) address;
-------------------------------------
我在最后一行看到 MISRA 消息“在指向易失性对象的指针和整数类型之间进行转换”。
知道如何避免这条消息吗?
谢谢!
MISRA 有一个禁止从整数转换为指针的咨询规则。理由是他们担心在整数不能表示指针或未对齐的情况下所涉及的定义不明确的行为。
这是过于迂腐的规则之一,仅供参考。大多数嵌入式系统都会偏离规则。
也就是说,您的代码包含一些有问题的东西:
- volatile 限定符不应是 typedef 的一部分。
a
和 b
声明没有任何意义,它们是某种丑陋的宏吗?
- 将结构映射到物理地址既不可移植又不安全。该结构可能包含填充,地址可能未针对给定类型正确对齐。至少,您需要一些方法来确保没有结构填充,最好是静态断言。
另请注意,MISRA 要求将整型常量写为 0xFFF45556u
。这不是一个坏主意,因为 0xFFF45556
是 unsigned int
类型,而例如 0x7FFFFFFF
是 signed int 类型。除非您小心,否则这些事情可能会导致与隐式类型提升相关的细微错误。
我有以下代码部分:
----------header---------------------
typedef volatile struct REG_Base{
a;
b;
}REG_t
#define address (0xFFF45556)
------------------------------------
--------Source-----------------------
LOCAL REG_t *pToREG;
pToREG= (REG_t *) address;
-------------------------------------
我在最后一行看到 MISRA 消息“在指向易失性对象的指针和整数类型之间进行转换”。
知道如何避免这条消息吗?
谢谢!
MISRA 有一个禁止从整数转换为指针的咨询规则。理由是他们担心在整数不能表示指针或未对齐的情况下所涉及的定义不明确的行为。
这是过于迂腐的规则之一,仅供参考。大多数嵌入式系统都会偏离规则。
也就是说,您的代码包含一些有问题的东西:
- volatile 限定符不应是 typedef 的一部分。
a
和b
声明没有任何意义,它们是某种丑陋的宏吗?- 将结构映射到物理地址既不可移植又不安全。该结构可能包含填充,地址可能未针对给定类型正确对齐。至少,您需要一些方法来确保没有结构填充,最好是静态断言。
另请注意,MISRA 要求将整型常量写为 0xFFF45556u
。这不是一个坏主意,因为 0xFFF45556
是 unsigned int
类型,而例如 0x7FFFFFFF
是 signed int 类型。除非您小心,否则这些事情可能会导致与隐式类型提升相关的细微错误。