contributed by < guyleaf >
詳細程式內容: Github
新增兩個 macro
min(a, b)
用於取最小值IS_NULL_EMPTY(s)
用於檢查指標為NULL或變數為0新增 tail 指標以及 list size
特別注意,在分配記憶體空間後,需檢查是否有分配成功
有則回傳指標,沒有則回傳NULL
個人偏向釋放記憶體之前,先把變數內容全部歸零,清除敏感資料
這裡也需要判斷 queue 是否為 NULL ,沒有則回傳0
使用 make SANITIZER=1 並 make test ,遇到 global buffer overflow ,發現是關於_Bool (C99 新增) 記憶體位址轉型為 int *
存取時所發生的錯誤
sizeof(_Bool)
: 1 bytesizeof(int)
: 4 bytes原先空間只有 1 byte 的 bool
型態 ,其記憶體位址轉型成 int *
,並由 int *valp
所指向,造成 *valp
存取時比原先多讀取 3 bytes,直接存取記憶體中的其他資料,造成錯誤
假如使用以下程式碼進行測試,如果未開啟 AddressSanitizer ,正常情況下也很難察覺會有問題
struct PELE
之儲存方式,改由使用 void *
以及 type sizeadd_param
之傳入參數,一樣改成傳入 void *
以及 type sizeread_valp
和 write_valp
functionwrite_valp
的 size
參數為 value 之大小進入qtest初始化後,在 push_file
function 會先allocate大約 9.9Kib 的空間給 rio_ptr
型態的 rnew
,如果輸入 ./qtest
時,沒有輸入 -f <input_file>
,就會改成讀取 stdin 的方式,再由 rio_ptr
型態的 buf_stack
指向 rnew
, 呼叫 readline
function 讀取 buf_stack->fd
資料流,讀取 cmd 或 檔案中的指令
之後隨著指令執行插入、刪除,由下圖可知輸入 ih head 20
時,記憶體用量上升, 輸入 rhq
多次,可以看到記憶體用量以階梯式逐漸減少,最後輸入 free
時,直接下降到當初初始化完成後的用量,再輸入 new
時,圖表顯示微微上升,輸入 quit
結束程式並完全釋放