contributed by < letticee
>
- 請持續更新進度!
- Fix code command 應修正為 "Modify comment"
課程助教
已改
作業說明:E01: lab0
在 macOS 上跑 cppcheck 時,會出現一個錯誤,導致無法 commit
[harness.c:147]: (error) Address of auto-variable 'new_block->payload' returned
Fail to pass static analysis.
猜測是因為他 return 了一個 local variable 的reference,出function就會消失了 (?
目前處理方法:到 ./lab0-c/scripts/pre-commit.hook
加入一個 cppcheck 的 option –suppress 來擋住那個 error
queue_t
中加入
list_ele_t *tail
q_insert_tail()
可以在常數時間內完成int size
q_size()
可以在常數時間內回傳 queue 的大小NULL
head = NULL
, tail = NULL
, size = 0
ele
,將 head
指標指到下一個元素。再 free 掉 ele
所指到的 value 跟 ele
指標NULL
的話回傳 false
false
false
next
指到原本 q 的 head
,然後將 q 的 head
指到新的 headhead
是 NULL
(原本是 empty queue),將 tail
也指到新的 headsize
加 1strdup()
做到配置空間和複製字串的功能,但因為在 harness.h
裡有 define 使用自定義的 test_malloc()
取代 malloc()
。實驗過後,發現 strdup()
在配置空間的時候不會呼叫到自定義的 test_malloc()
,所以會造成 test 不過。
strdup()
版本malloc()
+ strcpy()
版本NULL
的話回傳 false
false
false
head
的 next
指到新的 tail,新的 tail 的 next
指到 NULL
tail
指到新的 tailsize
加 1NULL
或 empty ( head
是 NULL
)的話回傳 false
NULL
,將 sp
空間內的 bufsize
大小範圍都設為 '\0'
,然後將 head
的 value
中 bufsize - 1
大小的字串複製到 sp
head
的指標複製一份到 oldh
,將 head
指到原本的 head 的下一個元素。再 free 掉 oldh
所指到的 value
跟 oldh
指標NULL
或 empty ,回傳 0size
NULL
或 empty 的話,直接 returnpre
, itr
, post
三個指標,分別指到 NULL
, head
, itr->next
,然後將 tail
指到 head
itr
的 next
指到 pre
,pre
指到 itr
,itr
指到 post
,post
指到 post
的 next
( 將所有元素的 next
指到前一個元素 ),直到 post
是 NULL
,也就是 itr
指到的是 q 的最後一個元素itr
的 next
指到 pre
,將 head
指到 itr
Makefile
可以得知 make
完後會產生一個 qtest
的可執行檔make test
指令會去執行 driver.py
make clean
指令會清除 make
產生的檔案driver.py
driver.py
首先會呼叫 run()
,run()
主要是處理參數(-h
-p
-t
-v
-a
),接著呼叫Tracer.run()
-h
:印出參數說明-p
:要測試的程式,預設是 ./qtest
-t
:要測試的命令在 traceDict 裡的編號-v
:測試訊息的詳細程度(0 - 3),預設是 1
-v 0
參數:僅列出每個測驗的分數
-v 1
:多印出測驗內容
-v 2
:多印出測驗的指令內容
-v 3
:多印出 queue 裡面儲存的內容
-A
:在最後產生 JSON 格式的成績單Tracer.run()
中會將 trace-01 – trace-15 依序執行一次 Tracer.runTrace()
,根據回傳值判斷該測驗的分數、計算總分並印出成績
Tracer.runTrace()
呼叫 subprocess.call()
並傳入參數來執行 qtest
qtest.c
-h
-f
-v
-l
)
-h
:印出參數說明-f
:要讀入的 command 檔-v
:測試訊息的詳細程度-l
:將測試訊息輸出成檔console_init()
內呼叫 add_cmd()
來加入 cmd 指令queue
的 function 去操作 q、輸出警告和錯誤訊息(包括檢查 queue.c
的實作是否會發生 segmentation fault 和 timeout)test_malloc()
和 test_free()
harness.h
中可以看到有 define 使用自定義的 test_malloc()
取代 malloc()
、 test_free()
取代 free()
harness.c
的 test_malloc()
中會呼叫 fail_allocation()
根據現在的 fail_probability
機率回傳 NULL
。並將 malloc 的空間以 double linked list 儲存,以知道 malloc 了幾個 block (?,test_free()
也是從 linked list 去釋放空間