1. 程式人生 > >深入理解計算機系統》 練習題2.37答案

深入理解計算機系統》 練習題2.37答案

XDR庫中的安全漏洞

在這裡插入圖片描述 1)size_t是unsigned int型的。 2)malloc的函式原型是void *malloc(unsigned int size)

如果第9行程式碼裡,ele_cnt * ele_size的乘積結果超過了unsigned int的範圍([0, 23212^{32}-1]),就會發生正溢位,乘積結果就會被截斷,結果為 乘積 mod 2322^{32}在這裡插入圖片描述 按照原文描述,malloc函式只會分配4096個位元組的空間用來複制,但由於ele_cnt還是很大,所以在4096個位元組都已經複製後,後面的那麼多位元組還會進行復制,但後面的位元組明顯都不是malloc函式分配的空間,所以就會在後面的複製發生錯誤。

這段程式碼有什麼改進?

    uint64_t asize = ele_cnt * (uint64_t) ele_size;
    void *result = malloc(asize);

假設會溢位,那麼雖然到了asize這步還不會溢位,因為在等式右邊已經先把兩個乘子強制型別轉換為uint64_t了。 但是到了malloc函式時,由於此函式的原型設計,還是會被截斷,傳入malloc函式時發生溢位。

如何修改

      uint64_t asize = ele_cnt * (uint64_t) ele_size;
      unsigned int asize2 = ele_cnt *
ele_size; if (asize == asize2) {//執行分配 } else { //丟擲異常}

檢測溢位,這裡用截斷來檢測。也可以用除法來檢測。見上一篇部落格。