189 8069 5689

对整型变量存储溢出的一些思考-创新互联

今天在网上看到一篇文章,介绍了一个因为错误使用整型变量而产生的bug。

目前成都创新互联公司已为近千家的企业提供了网站建设、域名、雅安服务器托管网站托管、企业网站设计、河津网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

文中有一小段我未能理解:

很显然,大量程序员考虑不周,使用4个字节的整数保存电话号码。当用户输入的号码大于2147483647时,就会自动转成这个数字。

我发现评论里有许多人和我有类似的疑问:为什么输入一个很大的数字之后,会自动转换成2147483647,而不是报错或者变成其他奇怪的值。

经过和网友的讨论,我做了一些实验,来测试当试图存入一个会溢出的数字时,会发生什么?

测试用代码:

int a = (int) 0xAABBCCDDEEFF1122LL;//若不使用强制类型转换,编译器会报错
printf("%d %X",a,a);

运行后的结果:

-285273822 EEFF1122

我发现,这个超长的整数在赋值之前被截断了,而并非像文章中所描述的那样取了整型范围内的大值。

这时有人指出,在操作MySQL数据库时,如果插入的整数值超过其大范围,会取范围内允许的大值。同时附上了截图

至此,我的困惑才得以解答。原来是在数据库存储时,使用了错误的数据类型,才导致了这个bug出现。

类似的问题如果出现在生产环境中,将带来不小的灾难,所以作为操作数据库的程序员、测试、运维人员,有必要借助良好的规范和可靠的工具来避免事故的发生。

对数据库的SQL操作进行审计,是有必要的。

借助SQLDEV,可以方便的查看、审计、溯源每一行SQL语句。还能针对不同角色,自定义字段屏蔽、打码规则

支持的数据源类型也有很多,尤其是对大量国产数据库做了兼容

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:对整型变量存储溢出的一些思考-创新互联
网址分享:http://cdxtjz.cn/article/cscpji.html

其他资讯