2014-05-12

小心 int 乘法溢出!

Views: 16950 | 2 Comments

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

小心乘法运算!

Related posts:

  1. 使用 jemalloc 编译过程出错的问题
  2. SSDB 使用 jemalloc
  3. iOS 正确接收 HTTP chunked 数据的方法
  4. C++成员函数作为pthread_create参数
  5. 关于 C++ 中的函数指针
Posted by ideawu at 2014-05-12 23:52:47

2 Responses to "小心 int 乘法溢出!"

Leave a Comment