[英]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.