c++ - C代码——需要说明有效性

标签 c++ c unix gdb dbx

您好,我已经根据需求编写了代码。

(field1_6)(field2_30)(field3_16)(field4_16)(field5_1)(field6_6)(field7_2)(field8_1 )..... 这是一个数据桶(8 个字段)。我们将一次收到 20 个桶,这意味着总共有 160 个字段。 我需要根据预定义的条件获取 field3、field7 和 fields8 的值。 如果输入参数是 N 然后从第一个桶中取出三个字段,如果是 Y 我需要 从第一个桶以外的任何其他桶中取出三个字段。 如果 argumnet 是 Y 那么我需要依次扫描所有 20 个桶并检查 桶的第一个字段不等于 0,如果为真,则获取该桶的三个字段并退出。 我已经编写了代码并且它也可以正常工作..但不太相信它是有效的。 我担心有时会崩溃。请在下面建议代码。

int CMI9_auxc_parse_balance_info(char *i_balance_info,char  *i_use_balance_ind,char *o_balance,char *o_balance_change,char *o_balance_sign
)
{
  char *pch = NULL;
  char *balance_id[MAX_BUCKETS] = {NULL};
  char balance_info[BALANCE_INFO_FIELD_MAX_LENTH] = {0};
  char *str[160] = {NULL};
  int i=0,j=0,b_id=0,b_ind=0,bc_ind=0,bs_ind=0,rc;
  int total_bukets ;
  memset(balance_info,' ',BALANCE_INFO_FIELD_MAX_LENTH);
  memcpy(balance_info,i_balance_info,BALANCE_INFO_FIELD_MAX_LENTH);
  //balance_info[BALANCE_INFO_FIELD_MAX_LENTH]='\0';
  pch = strtok (balance_info,"*");
  while (pch != NULL && i < 160)
  {
     str[i]=(char*)malloc(strlen(pch) + 1);
     strcpy(str[i],pch);
     pch = strtok (NULL, "*");
     i++;
  }
total_bukets  = i/8  ;
  for (j=0;str[b_id]!=NULL,j<total_bukets;j++)
  {
  balance_id[j]=str[b_id];
  b_id=b_id+8;
  }
  if (!memcmp(i_use_balance_ind,"Y",1))
  {
     if (atoi(balance_id[0])==1)
     {
        memcpy(o_balance,str[2],16);
        memcpy(o_balance_change,str[3],16);
        memcpy(o_balance_sign,str[7],1);
        for(i=0;i<160;i++)
        free(str[i]);
        return 1;
     }
     else
     {
        for(i=0;i<160;i++)
        free(str[i]);
      return 0;
     }
  }
  else if (!memcmp(i_use_balance_ind,"N",1))
  {
      for (j=1;balance_id[j]!=NULL,j<MAX_BUCKETS;j++)
      {
        b_ind=(j*8)+2;
        bc_ind=(j*8)+3;
        bs_ind=(j*8)+7;
       if (atoi(balance_id[j])!=1 && atoi( str[bc_ind] )!=0)
       {
        memcpy(o_balance,str[b_ind],16);
        memcpy(o_balance_change,str[bc_ind],16);
        memcpy(o_balance_sign,str[bs_ind],1);
        for(i=0;i<160;i++)
        free(str[i]);
        return 1;
       }
      }
     for(i=0;i<160;i++)
     free(str[i]);
    return 0;
  }
 for(i=0;i<160;i++)
 free(str[i]);
return 0;
}

最佳答案

我的感觉是这段代码很脆弱。如果提供良好的输入(我不建议为您检查这件事),它可能会很好地工作,但如果提供一些不正确的输入,它会崩溃并燃烧或给出误导性的结果。

您是否测试过意外输入?例如:

  • 假设 i_balance_info 为空?
  • 假设 i_balance_info 是“”?
  • 假设输入的字符串少于8个,这行代码会做什么?

    memcpy(o_balance_sign,str[7],1);
    
  • 假设str[3]中的item长度小于16个字符,这行代码会做什么?

    memcpy(o_balance_change,str[3],16);
    

我编写此类代码的方法是防止所有此类事件发生。至少我会添加 ASSERT() 语句,我通常会编写显式输入验证并在错误时返回错误。这里的问题是界面似乎不允许任何可能存在错误输入的可能性。

关于c++ - C代码——需要说明有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1542001/

相关文章:

c - 代码错误,用C语言编程

c - __libc_freeres() 中的 free()/delete/delete[]/realloc() 无效

linux - awk 三重文件输入

linux - 在搜索其中包含 '/' 的字符串时,是否可以在 vi 编辑器中转义 '/'?

c - "FILE *fp, *fopen();"是做什么的?

c++ - 分离轴定理: rotation around center of mass

C++/MFC 错误访问控件的变量

c - `strtod("3ex", &end )` supposed to be? What about ` sscanf` 的结果是什么?

c++ - 多线程:thread 或 process.h - C++

c++ - 在被调用方强制进行重载选择