一小段测试atof的代码

时间:2023-03-08 21:37:25
#include <stdio.h>
//#include <stdlib.h> double a=0;
int main(int argc, char *argv[])
{
a = atof(argv[1]);
double b=a+2; printf("b = %f\n", b);
printf("a = %f\n", a); return 0;
}

  不管是否把注释的//放开,都能编译链接正常,把注释的//打开,atof的行为则正常,否则异常。

也就是说atof存在两个定义,一个正确实现,一个没有实现?咨询了一个做工具链的同事,他的结论是:

反汇编对比两个生成的代码,发现返回值的问题,正常的返回是float,异常的是返回0,也就是异常使用的是eax寄存器,而

atof的实现,它的返回值不是在eax中的,是在xmm0中。

其实真正的原因是:带了头文件包含stdlib.h,则会根据函数声明,生成正确的调用代码,否则就会默认地使用eax作为返回值的寄存器。