问题描述
在C工程中,一个64位系统中如果一个文件中的某个函数A调用另外一个文件中的函数B,但是A文件中没有包含B的声明,gcc可以编译通过,但是如果B函数的返回类型为指针,在64位系统应该返回64bit地址,实际上函数A调用B得到的B的返回指针却是32bit,高32bit被截断。
代码示例
https://github.com/musiclvme/ToolsPackages/tree/master/function_def
test.c 里面调用了def.c里面的def_test,但是没有包含def_test.h的声明, 最后ret1得到返回指针为0x13095260,是32bit,高32bit被丢弃了。这样就会导致后面使用ret1这个指针时候肯定会出现问题。
总结
gcc编译器对本函数调用未声明的函数,都为强制将其返回值类型转为int类型,int在64bit系统中占4个字节,这样指针类型的返回值就会出现截断现象!
这类问题需要留意编译当中的警示:warning: implicit declaration of function 'def_test' [-Wimplicit-function-declaration]