简体   繁体   English

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

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

When I try and run my program I get this warning and some weird bugs.当我尝试运行我的程序时,我收到了这个警告和一些奇怪的错误。 rmi_pdu in the following structure contains a variable sized array which I want to access.以下结构中的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;

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 .内容在那里,但free() API 是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.想要使用 rmi 的调用者会将大小作为参数传递。

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. len作为参数传递。

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)...你有...sizeof(struct rmi_message_s *)... ,但它应该是...sizeof(struct rmi_message_s)...

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.警告是因为如果您混合来自 GCC 4.3 或更早版本和 GCC 4.4 或更高版本的代码,则它们在如何在堆栈上传递该结构方面不兼容。 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.它会非常低效,而且你会失去你的有效载荷。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM