IT技术博客大学习 共学习 共进步

小心 int 乘法溢出!

idea's blog 2014-11-23 21:33:03 浏览 2,284 次

   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 项目里就踩到过几次这种坑! 所以, 记住

   小心乘法运算!

建议继续学习

  1. 最常见的电话号码 (阅读 8,745)
  2. java中byte转换int时为何与0xff进行与运算 (阅读 4,083)
  3. 整型(int)数字溢出在程序和数据库设计中的考虑 (阅读 3,764)
  4. java中byte转换int时为何与0xff进行与运算 (阅读 3,406)
  5. C语言的整型溢出问题 (阅读 3,262)
  6. 大整数乘法 (阅读 2,403)
  7. Android libcutils库中整数溢出导致的堆破坏漏洞的发现与利用 (阅读 1,827)