2

プログラムを実行しようとすると、この警告といくつかの奇妙なバグが発生します。 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引数として渡されます。

4

2 に答える 2

5

十分なメモリを割り当てていません:

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)...

于 2012-01-16T17:37:51.053 に答える
3

ほとんどの場合、このオブジェクトを値で渡したくありません。代わりに、オブジェクトへのポインターまたは参照を渡します。

この警告は、GCC 4.3 以前のコードと GCC 4.4 以降のコードを混在させている場合、スタック上でその構造体を渡す方法に関して互換性がないためです。いずれにせよ、実際にはそれをスタックに渡したくないと確信しています。それは非常に非効率的であり、ペイロードを失うことになります.

于 2012-01-16T17:05:08.677 に答える