c語言內存申請函數

幾個常用的內存分配函數

void* malloc(size_t size)

void* calloc(size_t memb,size_t size)

void* realloc(void *p,size_t size)

void* aligned_alloc(siee_t alignment, size_t size)

所引發的錯誤

  • 1.初始化錯誤
  • 2.未檢查返回值
  • 3.對空指針或無效指針解引用
  • 4.引用已釋放的內存
  • 5.對同一塊內存釋放多次
  • 6.內存泄漏
  • 7.零長度分配

1.初始化錯誤

使用malloc()函數在堆區申請的內存塊,可能是上一個程序的遺留,具有隱私信息;   由此引發了三個標準


1."不要假定內存分配函數已經初始化" -(C安全編碼標準)
2."不要引用未初始化內存       " -(C安全編碼標準)
3."清除可能重複使用資源中的敏感信息" -(C安全編碼標準)

2.未檢查返回值

sign* start = malloc(nmuOfRecodrds * sizeof(sign));
sign* point=(sign*)start;
point=start+tempNum-1;

//當malloc申請失敗時返回null;而後攻擊者可以直接控制tempNum變量實現任意代碼執行


//"檢測和處理內存分配錯誤"  -(C安全編碼標準)

3.空指針或無效指針解引用

無效指針解引用:就是指引用無效值:空指針,
未按照指定對象類型的正確對齊地址,生存週期結束後的對象地址;

4.引用已釋放的內存

看對象所存儲的內存模型是哪裏,還有他的生命週期;
   如:
   當原有的內存被釋放,但是內存地址被保留到*p中,而後另外一個函數,
   被重新分配到與它對齊大小的數據塊,然後*p就可以使用這一塊內存。

5.對同一塊內存釋放多次

int main(void){
    char* a=NULL ;
    char* b=NULL;


    a=(char *)malloc(sizeof(char)*3);
    free(a);
    b=(char *)malloc(sizeof(char)*3);
    free(a);
    //由於程序員的複製原因忘記改變free(b)所以導致的內存二次釋放問題,會拋出異常,但是一般不會產生後果,但是會導致直接忘記釋放b所指向的內存塊,從而導致內存泄漏
    //由於在系統層面上,內存管理器對於堆內存的管理其實不會清零,而是將標誌位置爲零。
    return 0;
}

6.內存泄漏

  這個問題是我最早接觸的關於內存的問題,簡單來說就是內存沒有回收。
  實際上可能引出很多問題,如果攻擊者可以引用內存分配函數,
  而且還沒有被釋放掉,就可能導致拒絕服務攻擊。
  還有就是其實堆內存是由操作系統管理的,如果main函數結束之後,堆就會清空
  ,就以目前的內存來說,這根本就不足以造成很大的影響,
  但是如果內存泄漏是發生在一個多次引用的函數中,如dll或者so中,就會造成很大的影響

7.零長度分配

暫時沒怎麼看懂,但是我瞭解到零長度數組在struct中的作用,
結束一個帶有零長度數組的結構,以允許該數組根據需要動態調整大小.這非常方便,當我想確定我的struct在運行時而不是編譯時佔用的空間量時,
可以節省大量內存。c99支持,gcc也支持,但是vs不支持
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章