首页 > 其他分享 >是谁修改了常量的值

是谁修改了常量的值

时间:2023-01-17 13:37:16浏览次数:33  
标签:curr 常量 修改 base conf cdr local name

前天在下班回家的路上,正在刷哔哩哔哩的语音识别的教程,同事打电话向我求助,莫名其妙一个常量的值变了,导致话单生成不正常。随后他将代码发到我的QQ上。

      printf("curr_file_base_name sp1 ='%s'\n",curr_file_base_name);
      sprintf(curr_file_name, "%s/%s/%s/%s", gCdrTable->cdr_conf_table.all_local_home_dir, cdr_conf_base[type].cdr_type, curr_day, curr_file_base_name);
      
      printf("curr_file_base_name sp2 ='%s'\n",curr_file_base_name);
      printf("local home dir sp2 ='%s'\n",gCdrTable->cdr_conf_table.all_local_home_dir);
      printf("cdr_type sp2 ='%s'\n",cdr_conf_base[type].cdr_type);

给gCdrTable->cdr_conf_table.all_local_home_dir成员函数赋值,但是curr_file_base_name sp1变量的值发生的变化。

对于这样的问题,我脑子里立刻闪现出以前调试BICC信令网关时,越界赋值导致的类似现象。于是我让他检查下gCdrTable->cdr_conf_table.all_local_home_dir这个成员的分配的内存。

       经过他确认,sprintf赋值后,超过了gCdrTable->cdr_conf_table.all_local_home_dir分配的内存。

      经过调整gCdrTable->cdr_conf_table.all_local_home_dir分配的内存,问题得到解决。但如果想要更安全的话,推荐使用snprintf,限制赋值的长度,也可以起到避免越界的作用。

      int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...);

    函数说明:最多从源串中拷贝 n-1 个字符到目标串中,然后再在后面加一个 '\0'。所以如果目标串的大小为 n 的话,将不会溢出。

函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

标签:curr,常量,修改,base,conf,cdr,local,name
From: https://blog.51cto.com/u_15942605/6017166

相关文章