小心 int 乘法溢出!

分類:IT技術 時間:2017-10-01

   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 項目裏就踩到過幾次這種坑! 所以, 記住

   小心乘法運算!


Tags: nbsp 乘法 1073741824 malloc size_t 所以

文章來源:


ads
ads

相關文章
ads

相關文章

ad