getting the following warning : The ABI of passing struct with a flexible array member has changed in GCC 4.4

本秂侑毒 提交于 2020-04-30 04:26:05

问题


I am getting this warning and weird bugs , when I try and run my program. rmi_pdu in the following structure contains a variable sized array..which I should use. Any info on this appreciated.

struct rmi_message_s {  /* Queue element containing Rmi message */
    struct rmi_message_s          *hnext;
    struct rmi_message_s          *hprev;
    uint16_t                      gen_counter;   /* Generation counter */
    time_value                    send_time;
    uint8_t                       retry_count;
    TAILQ_ENTRY(rmi_message_s)    rmi_message_next;
    rmi_message_pdu               rmi_pdu; /* contains a variable sized array */ 
};

typedef struct {
    uint16_t        zero;
    uint16_t        type;
    uint8_t         version;
    uint8_t         len;
    uint8_t         protocol;
    uint16_t        edge_port;
    uint16_t        core_port;
    uint32_t        connexus_id;
    pi_ipv4_addr_t  edge_addr;
    pi_ipv4_addr_t  core_addr;
    uint16_t        gen_count;     /* Integer to identify a stale packet */
    uint8_t         payload[];
} rmi_message_pdu;

the problem is when I am trying to free the memory which I am dynamically allocating. The contents are there but the free() API is abort()ing . This what the core looks like

in raise () from /lib64/libc.so.6
in abort () from /lib64/libc.so.6
in __libc_message () from /lib64/libc.so.6
in _int_free () from /lib64/libc.so.6
in free () from /lib64/libc.so.6
in free (p=0x2aaabc000fa0) at mallocdbg.cc:188
in rmi_hash_cleanup (rmi_msg=0x2aaabc000fa0) at tcpsvc_rmi.c:126
in rmi_process_response (response_packet=0x27422e00) at tcpsvc_rmi.c:239
in rmi_message_handle (pkt=0x27422e00 "", cnt=28) at tcpsvc_base.c:154
in udpif_worker (arg=0x2b01f7014340) at rumpnet_virtif/if_udp_netbsd_guest.c:573
in threadbouncer (arg=0x2b01f7016428) at rumpkern/emul.c:428
in clone () from /lib64/libc.so.6

This is what the allocation looks like The caller who wants to use rmi, will pass the size as an argument.

    struct rmi_message_s *rmi_msg ;
    rmi_msg = (struct rmi_message_s *) malloc
           (sizeof(struct rmi_message_s *) + len * sizeof(uint8_t));

len is passed as an argument.


回答1:


You are not allocating enough memory:

struct rmi_message_s *rmi_msg ;
    rmi_msg = (struct rmi_message_s *) malloc
           (sizeof(struct rmi_message_s) + len * sizeof(uint8_t));

You had ...sizeof(struct rmi_message_s *)..., but it should have been ...sizeof(struct rmi_message_s)...




回答2:


You almost certainly don't want to pass this object by value. Pass a pointer or reference to the object instead.

The warning is because if you are mixing code from GCC 4.3 or earlier, and GCC 4.4 or newer, they are incompatible in regards to how they would pass that struct on the stack. At any rate, I'm pretty sure you don't actually want to pass that on the stack anyway. It'd be hugely inefficient, and you'd lose your payload.



来源:https://stackoverflow.com/questions/8883439/getting-the-following-warning-the-abi-of-passing-struct-with-a-flexible-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!