前两天遇到一个很怪的问题,一个函数执行的结果不正确.使用gdb跟踪,发现调用函数时输入参数是a,进入函数执行体之后,参数值变成b了,象我这么有理性的人怎么会相信这么无稽的事呢?于是继续调试,汇编单步跟踪,发现传进函数的地址的确跟调用时的地址不一样,这可就怪了,超出能力之外,请教高人吧,折腾了半天终于发现了问题所在.
原来GCC的较新版本中使用了一个扩展语法,__attribute__((regparm(3),stdcall)),有这个声明的函数,该属性将使得GCC在编译该函数时,采用寄存器传参的方式,以提高函数压栈速度.无该声明的函数则使用x86默认的堆栈传参的方式.因为我的代码是从开源代码里kiang出来的,版本较老,没有这样的处理,所以就玩出毛病了.
后来在调用函数的文件中,增加一个extern声明,该问题就解决了.
其实还是因为很久没玩C了(一直在用java),所以一些基本的常识都没注意到,否则还是能避免花这些时间的
1.使用外部函数时,一定要加extern声明
2.要重视implicit declararion of funciton类的告警,它可能预示着程序运行的逻辑错误