0

我在一些现有的代码中发现了它,它看起来有些问题,但是代码工作正常,如果这段代码有任何欺骗性的东西,你能帮忙吗?

为什么在计算结构的大小时忽略两个无符号?

        tmsg_sz = sizeof(plfm_xml_header_t) + sizeof(oid_t) + sizeof(char*)
            + sizeof(unsigned) + sizeof(snmp_varbind_t)*5 ;
        tmsg = (snmp_trap_t*) malloc(tmsg_sz);
        if (!tmsg) {
            PRINTF("malloc failed \n");
            free(trap_msg);
            return -1;
        }
        memset (tmsg, 0, tmsg_sz);
        tmsg->hdr.type = PLFM_SNMPTRAP_MSG;
        copy_oid_oidt(clog_msg_gen_notif_oid, OID_LENGTH(clog_msg_gen_notif_oid), &tmsg->oid);
        tmsg->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
        tmsg->trap_specific = 1;
        tmsg->trapmsg = strdup("Trap Message");
        tmsg->numofvar = 5;
        build_snmp_varbind(&(tmsg->vars[0]), facility, STR_DATA_TYPE, sizeof(facility)+1, clog_hist_facility_oid, 14);

        build_snmp_varbind(&(tmsg->vars[1]), &sev, U32_DATA_TYPE, sizeof(sev),clog_hist_severity_oid, 14);

        build_snmp_varbind(&(tmsg->vars[2]), name, STR_DATA_TYPE, sizeof(name)+1, clog_hist_msgname_oid, 14);

        build_snmp_varbind(&(tmsg->vars[3]), trap_msg, STR_DATA_TYPE, strlen(trap_msg)+1,clog_hist_msgtext_oid, 14);

        // get system uptime
        long uptime = get_uptime();
        build_snmp_varbind(&(tmsg->vars[4]), (long*)&uptime, TMR_DATA_TYPE, sizeof(uptime),clog_hist_timestamp_oid, 14);  



  typedef struct snmp_trap_s {
      plfm_xml_header_t hdr;
      oid_t             oid;        /* trap oid */
      unsigned          trap_type;
      unsigned          trap_specific;
      char              *trapmsg;   /* text message for this trap */
      unsigned          numofvar;
      snmp_varbind_t    vars[0];
  } __attribute__((__packed__)) snmp_trap_t;
4

1 回答 1

0

编译器努力使多字节数据以各种方式对齐。例如,int架构中的变量sizeof int == 4可能需要放置在可被 整除的位置4。这可能是一个硬性要求,或者这可能只是让系统更有效率;这取决于计算机。所以,考虑

typedef struct combo {
    char c;
    int  i;
} combo;

根据架构,sizeof combo可能是 5、6 或最常见的 8。交换两个成员,大小应为 5。

typedef struct combo2 {
    int  i;
    char c;
} combo2;

但是,一个 s 数组combo2可能具有您不期望的大小:

combo2 cb[2];

的大小cb很可能是 16,因为 3 个字节的浪费空间跟在combo2[0]和之后combo2[1]。这让我们combo2[1].i从可被 4 整除的位置开始。

建议按大小对结构的成员进行排序;8 字节成员应该在 4 字节成员之前,然后是 2 字节成员,然后是 1 字节成员。当然,你必须知道典型的大小,你不能在一个奇怪的架构上工作,其中字符没有被打包成更大的单词。克雷?咳咳

于 2013-07-18T23:34:57.543 回答