得到以下警告:在GCC 4.4中,使用灵活数组成员传递struct的ABI已更改

时间:2012-01-16 16:57:08

标签: c flexible-array-member

当我尝试运行我的程序时,我收到了这个警告和奇怪的错误。 以下结构中的rmi_pdu包含一个可变大小的数组..我应该使用它。 有关此的任何信息表示赞赏。

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;

问题是当我试图释放我动态分配的内存时。内容在那里,但free()API是abort()ing。这就是核心的样子

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

这就是分配的样子 想要使用rmi的调用者将传递大小作为参数。

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

len作为参数传递。

2 个答案:

答案 0 :(得分:3)

您没有分配足够的内存:

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

您有...sizeof(struct rmi_message_s *)...,但应该是...sizeof(struct rmi_message_s)...

答案 1 :(得分:2)

您几乎肯定不希望按值传递此对象。改为将指针或引用传递给对象。

警告是因为如果您要混合来自GCC 4.3或更早版本以及GCC 4.4或更新版本的代码,则它们在如何在堆栈上传递该结构时是不兼容的。无论如何,我很确定你实际上并不想在堆栈上传递它。这将是非常低效的,你将失去你的有效载荷。