首页 文章

解决GCC警告:“通过临时指针解除引用类型 - 惩罚指针将破坏严格别名规则”

提问于
浏览
2

在功能

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 回答

  • 2

    基本上这是GCC的 -Wstrict-aliasing 机器中的一个错误 . 众所周知,它们都会产生错误警告并错过实际的别名违规(参见开发人员的this comment) .

    在两种情况下都存在问题,转换不相关的结构将违反别名规则,并可能导致GCC产生意外的代码 .

相关问题