类型解除引用类型 - 惩罚指针将破坏严格别名规则

时间:2016-07-19 18:58:15

标签: c

我在这段代码中有一个编译器警告('type dereferencing type-punned pointer将破坏严格别名规则'):

volatile uint8_t Buff[READ_BUFF_SIZE];

#define   LD_DWORD(ptr)      (DWORD)(*(DWORD*)(BYTE*)(ptr))

ChunkID = LD_DWORD(&Buff[0]); <-- here is warning

我在32位Cortex M0上。

尽管有警告,但工作正常。我的问题是,警告可以解决吗?

1 个答案:

答案 0 :(得分:3)

重新解释没有分配存储持续时间的对象作为其他(不兼容)类型的对象是未定义的行为。

在示例Buff中,类型uint8_t具有静态或自动存储持续时间,正在重新解释为类型DWORD。那些类型不兼容 1 ,行为未定义。

您只需将Buff定义为您打算使用的类型,即DWORD

volatile DWORD Buff[READ_BUFF_SIZE];

然后您不需要访问宏,只需使用内置运算符即可:

ChunkID = Buff[0];

1 即使我们假设 2 uint8_t被定义为unsigned char,它可能是任何类型的别名,类型DWORD可能不是别名{{1} }。

2 标准允许类型unsigned char未定义为uint8_t,即使CHAR_BIT为8.请参阅扩展整数类型。