Wenlong的博客

« 如何无交互的自动安装Solaris软件包 | Main | 普通用户如何来监听1024以下端口 »

http://developers.sun.com.cn/blog/wenlong/date/20060904 星期一 九月 04, 2006

32位到64位移植的问题

上周有个客户在进行Solaris移植时,编译好的代码在一个地方就会crash,产生core文件,造成这个错误的代码为:
ptr = (char *)malloc(strlen(data) *(sizeof(char))+1)

按照常理,有这样错误,首先应该检查data是否为NULL,可每次调用时,data被赋予一个const char *,就是一个字符串常量,是没有问题的,看来问题应该是出在别的地方了。

后来得知,这段代码如果是编译为32位,就不会产生错误,如果编译为64位,就会产生core dump,看来问题应该处在数据类型的转换上,重点查integer,long 和pointer类型。在32情况下,着三个数据类型为32位,而64位情况下,integer型还是32位,但后面两个类型为64位,因为在客户程序中只有两个类型被调用,integer和char *,重点还是在integer上面。果然,在一个类似上面提到的代码中发现了一些问题,看

ptr = (int *)malloc(sizeof(int));

在这句话里,为prt来分配一个指针型的长度空间,但由于int型为32位,实际分到的空间就不是64位,这样就造成以后对ptr的操作会造成非法访问,从而造成core dump,将这段代码稍作调整

ptr = (int *)malloc(sizeof(int *));

程序就工作正常了。

以上只是在从32位移植到64位时碰到的一个实例,通过这个我们可以看出,如果大家要做这种移植,一定要注意这几个数据类型由于长度带来的问题,如果出现错误,先要排除这些数据类型带来的错误。有时单从错误的表面现象来分析,却很难下手,找不到错误的根源。

Comments:

估计是bus 访问错误导致的core. 不会是malloc分配的错误. 比如64位下一个long *lp = (long *)malloc(sizeof(int)) ; lp 的操作会引起 bus access 错误. 导致core.

Posted by 曾经 on 四月 24, 2007 at 07:24 下午 GMT+08:00 #

malloc不会出错,是分配了32位的地址空间,但还是按照64位来操作,导致SIGSEGV,这里有字数限制,写下个comments.

Posted by wenlong on 四月 24, 2007 at 07:25 下午 GMT+08:00 #

Incurred fault #6, FLTBOUNDS %pc = 0xFFFFFD7FFEB6AF8A
siginfo: SIGSEGV SEGV_MAPERR addr=0x008416A0
Received signal #11, SIGSEGV [default]
siginfo: SIGSEGV SEGV_MAPERR addr=0x008416A0

Posted by wenlong on 四月 24, 2007 at 07:25 下午 GMT+08:00 #

Post a Comment:
  • HTML Syntax: NOT allowed

Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.