网站优化试卷,wordpress 作者墙,宁波建设网站的公司,wordpress手机版难看本人在64位linux服务器上(centos7)#xff0c;发现xdr_u_long这个函数有个bug#xff0c;就是数字的范围如果超过unsigned int的最大值(4294967295)时#xff0c;xdr_u_long失败。
这个场景主要用在unix时间戳上面#xff0c;比如一款软件#xff0c;设置有效期为100年。…本人在64位linux服务器上(centos7)发现xdr_u_long这个函数有个bug就是数字的范围如果超过unsigned int的最大值(4294967295)时xdr_u_long失败。
这个场景主要用在unix时间戳上面比如一款软件设置有效期为100年。即失效时间为2124年10月26日对应的unix时间戳大概为4885545600。而xdr_u_long在编码数字4885545600时会报错。
经过测试xdr_u_long所能编码的最大值为4294967295此时间戳对应的时间大概是2106年。 但是xdr_u_long的函数 extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW; 这里面的u_long是unsigned long int;本人是64位的gcc编译器long类型是8个字节所能表示的数字范围远远大于4294967295。但是4294967296代入这个函数就会报错对应的c语言代码为
#include stdio.h
#include rpc/xdr.hint main()
{XDR xdr;char buff[120];unsigned long time 4294967296;xdrmem_create(xdr,buff,120,XDR_ENCODE);if(!xdr_u_long(xdr, time)){printf(xdr encode failed\n);return -1;}return 0;
}如果要编码大于4294967295不报错可以使用函数xdr_uint64_t。 而uint64_t和u_long的类型是一致的都是unsigned long int。
所以说xdr_u_long在表示范围大于4294967295时存在bug。