错误发生类型:代码在不同位数下的操作系统移植
错误提示类型:段错误
错误的发生源:iconv函数
错误的根本原因:代码从32位Redhat enterprise 5.5移植到64位的Centos时,没有注意到iconv的第三个和第五个参数的类型是size_t
错误代码:
-
/*-----txbug_tran_chars-----*/
-
static size_t txbug_tran_chars(TEXT *pText, iconv_t cCv, char *inBuf, int iSize, char *outBuf, int oSize)
-
{
-
char *pIn = inBuf, *pOut = outBuf;
-
int outByte = oSize;
-
-
while(iconv(cCv, &pIn, &iSize, &pOut, &outByte) == (size_t)FUN_RUN_FAIL) {
-
if(errno != EILSEQ) {
-
elog_write("txbug_tran_chars - iconv", ERROR_STR, pText->wt_url);
-
break;
-
}
-
-
*pIn = ' ';
-
}
-
-
return outByte;
-
}
修正后代码:
-
/*-----txbug_tran_chars-----*/
-
static size_t txbug_tran_chars(TEXT *pText, iconv_t cCv, char *inBuf, size_t iSize, char *outBuf, size_t oSize)
-
{
-
char *pIn = inBuf, *pOut = outBuf;
-
size_t outByte = oSize;
-
-
while(iconv(cCv, &pIn, &iSize, &pOut, &outByte) == (size_t)FUN_RUN_FAIL) {
-
if(errno != EILSEQ) {
-
elog_write("txbug_tran_chars - iconv", ERROR_STR, pText->wt_url);
-
break;
-
}
-
-
*pIn = ' ';
-
}
-
-
return outByte;
-
}
原因分析:
在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也一样
所以,千万不要把数组头给转进去了,不然,你就会挂得更美,更潇洒
阅读(1514) | 评论(0) | 转发(0) |