Chinaunix首页 | 论坛 | 博客

Bug

  • 博客访问: 3470
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-26 13:18
个人简介

这里有很多我在工作中碰到的bug,希望你不会在不同的时间、相同的地方产生相同的bug。:)

文章分类
文章存档

2015年(1)

我的朋友
最近访客

分类: LINUX

2015-08-26 15:44:08

错误发生类型:代码在不同位数下的操作系统移植
错误提示类型:段错误
错误的发生源:iconv函数
错误的根本原因:代码从32位Redhat enterprise 5.5移植到64位的Centos时,没有注意到iconv的第三个和第五个参数的类型是size_t
错误代码:

点击(此处)折叠或打开

  1. /*-----txbug_tran_chars-----*/
  2. static size_t txbug_tran_chars(TEXT *pText, iconv_t cCv, char *inBuf, int iSize, char *outBuf, int oSize)
  3. {
  4.     char    *pIn = inBuf, *pOut = outBuf;
  5.     int      outByte = oSize;

  6.     while(iconv(cCv, &pIn, &iSize, &pOut, &outByte) == (size_t)FUN_RUN_FAIL) {
  7.         if(errno != EILSEQ) {
  8.             elog_write("txbug_tran_chars - iconv", ERROR_STR, pText->wt_url);
  9.             break;
  10.         }

  11.         *pIn = ' ';
  12.     }

  13.     return    outByte;
  14. }
修正后代码:

点击(此处)折叠或打开

  1. /*-----txbug_tran_chars-----*/
  2. static size_t txbug_tran_chars(TEXT *pText, iconv_t cCv, char *inBuf, size_t iSize, char *outBuf, size_t oSize)
  3. {
  4.     char    *pIn = inBuf, *pOut = outBuf;
  5.     size_t    outByte = oSize;

  6.     while(iconv(cCv, &pIn, &iSize, &pOut, &outByte) == (size_t)FUN_RUN_FAIL) {
  7.         if(errno != EILSEQ) {
  8.             elog_write("txbug_tran_chars - iconv", ERROR_STR, pText->wt_url);
  9.             break;
  10.         }

  11.         *pIn = ' ';
  12.     }

  13.     return    outByte;
  14. }

原因分析:
在32位系统中,size_t普遍是4字节的,而到了64位系统中,size_t就是8字节了
但是,现今,在这两个系统当中,int都是4位的
在RHEL 5.5中,因为sizeof(int) and sizeof(size_t)都是一样的。所以,当初我就没有碰上这个SF,躲过了这颗子弹
不过,到了Centos 7,我就中弹身亡了
因为在iconv中,传送的是size_t的指针。于是,当它用到这个参数的时候,大概就会*iSize,这样,一读,就是8个字节的数据,而int只有4个字节,就是说,读多了,吃多了。于是就壮壮烈烈的被发了好人卡,挂了

其他:
iconv这个函数的第二,第四个参数也是需要注意的
传进去,出来就会边个样了,出来后,指针就会指着转换buf后停止的地方,输出buf也一样
所以,千万不要把数组头给转进去了,不然,你就会挂得更美,更潇洒

阅读(1435) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~