公司的intern在修改samba源码时,新加了一个配置项。
lp_keytab_principals()
这个函数返回const char **
在用const char **p = lp_keytab_principals()的时候,有waring
warning: initialization makes pointer from integer without a cast
64位下就crash了,找看3个小时问题所在。。
这是由于,次函数只在一个c文件中定义了,并没有对应的h文件声明
而C语言在没有显示声明的情况下,函数默认返回int
因此这个指针就截断了
本来是0x7FFFF822b260
变成了0xFFFFFFFFF822b260 (vsyscall地址了。。) 由于32位的首位是1,所以扩展的是符号位1,变成了FFFFFFF
因此就crash了
而人家samba原来是有个头文件叫proto.h的,里面声明了用到的函数原型,所以原来没问题,而intern没加。。。