在功能
size_t csps_socket_read(csps_socket_t *s, csps_packet_wrapper_t *packet, size_t sz)
我收到警告:“取消引用类型惩罚指针将破坏以下行中的严格别名规则[-Wstrict-aliasing]”:
packet_size = ((csps_packet_full_header_t *)s->receive_mem)->size + header_size;
如果我像这样重写:
csps_packet_full_header_t *packet_full_header = (csps_packet_full_header_t *)s->receive_mem;
packet_size = packet_full_header->size + header_size;
我没有得到任何警告 . 为什么?问题仍然存在,但是gcc看不到它?
这是涉及的结构:
typedef struct csps_socket_t_
{
void* fp;
bool open;
uint8_t receive_mem[CSPS_SOCKET_MEM];
uint32_t receive_index;
} csps_socket_t;
typedef struct ATTR_PACKED csps_packet_full_header_t_
{
uint8_t version:4;
uint8_t pclass:4;
uint8_t ch:1;
uint8_t reserved:7;
uint16_t size;
uint16_t sequence;
uint16_t checksum;
uint8_t src[8];
uint8_t dst[8];
} csps_packet_full_header_t;
1 回答
基本上这是GCC的
-Wstrict-aliasing
机器中的一个错误 . 众所周知,它们都会产生错误警告并错过实际的别名违规(参见开发人员的this comment) .在两种情况下都存在问题,转换不相关的结构将违反别名规则,并可能导致GCC产生意外的代码 .