小心 int 乘法溢出!
浏览:2143次 出处信息
C/C++ 语言里, 绝大部分平台上 int 类型是 32 位的, 无论你的操作系统是否是 64 位的. 而一些常用的函数, 如 malloc(), 它接受的参数是 size_t 类型:
void * malloc ( size_t size );
如果你写出这样的代码:
int mb = 3000; // 3000MB ~= 3GB void *p = malloc(mb * 1024 * 1024); // WRONG!
这是非常危险的, 因为那个乘法得到的结果也是 int 类型, 但已经溢出了, 所以
mb * 1024 * 1024 = -1073741824;
然后
malloc(-1073741824) = malloc((size_t)-1073741824);
在 64 位系统里, size_t 是 64 位正整数, 所以
(size_t)-1073741824 = 18446744072635809792
相当于你试图分配那么多内存! 远远超出你的相像. 我在 SSDB 项目里就踩到过几次这种坑! 所以, 记住
小心乘法运算!
建议继续学习:
- 最常见的电话号码 (阅读:8590)
- java中byte转换int时为何与0xff进行与运算 (阅读:3917)
- 整型(int)数字溢出在程序和数据库设计中的考虑 (阅读:3620)
- java中byte转换int时为何与0xff进行与运算 (阅读:3241)
- C语言的整型溢出问题 (阅读:3062)
- 大整数乘法 (阅读:2278)
- Android libcutils库中整数溢出导致的堆破坏漏洞的发现与利用 (阅读:1693)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:PHP中字符串截取的效率
后一篇:如何编程实现 2 + 2 = 5? >>
文章信息
- 作者:ideawu 来源: idea's blog
- 标签: int 乘法 溢出
- 发布时间:2014-11-23 21:33:03
建议继续学习
近3天十大热文
-
[1182] WordPress插件开发 -- 在插件使用 -
[74] 解决 nginx 反向代理网页首尾出现神秘字 -
[43] web开发设计人员不可不用的在线web工具和 -
[38] Java开发岗位面试题归类汇总 -
[31] 一句话crontab实现防ssh暴力破解 -
[31] Rax 系列教程(长列表) -
[30] 手机产品设计方向 -
[27] 程序员疫苗:代码注入 -
[27] 如何建立合适的索引? -
[26] oracle技术方面的路线
