contributed by < kaiweike >
上面的環境一直故障,後來換成這個實驗環境
offsetof (參考 你所不知道的 C 語言: linked list 和非連續記憶體-Linked list 在 Linux 核心原始程式碼-簡化的實作)
offsetof(type, member)
=>可得到成員的位址減去 struct 的起始位址
container_of (參考 Linux 核心原始程式碼巨集: container_of)
#define container_of(ptr, type, member)
=> 可得到 type 結構的 address
Common vulnerabilities guide for C programmers
“ Most vulnerabilities in C are related to buffer overflows external link and string manipulation. ”
fgets()
strlcpy()
or strncpy()
strncat()
strncmp()
snprintf()
不要只列出原始程式碼,要提出你的想法/推測,並予以驗證。請把開發紀錄當作「資訊科技公司面試的逐字稿」來面對,你現在若能用越專業的說法,明日就能表現更好。
參考 2020leon ,並改寫為更簡潔的寫法:
malloc
分配記憶體空間。INIT_LIST_HEAD
初始化 struct list_head
物件成員。後來刪掉 if 判斷中的 list_empty(l)
就好了,
因為當 list_empty() = !0
時表示 list is empty,
但 empty 還是指向有效結構,開頭(head)的值為NULL(參考 K01: lab0)。
參考 freshLiver 的寫法後,
發現原來是少了 malloc
和 memcpy
這兩個步驟,沒有配置指定大小的記憶體空間。
另外,發現 list_empty
!= null
,
“ 若你有空的紅包袋,裡面的東西是 empty;
若你連紅包袋都沒有,就可以說 NULL; ” (參考 K01: lab0)。
參考 freshLiver 的寫法,
進一步使用 strdup
簡化 malloc
、 memcpy
和 value[strlen(s)] = '\0'
的操作:
操作邏輯和 q_insert_head
一樣,只是將 list_add
更換成 list_add_tail
參考 LJP-TW 的寫法後修改為:
參考 eric88525 的寫法
參考 kdvnt 更精簡的方法:
參考 你所不知道的 C 語言: linked list 和非連續記憶體- MergeSort的實作
測項 14 和 15 指出效能不夠好
推測可能是因為執行遞迴需要多次函式呼叫,如果呼叫層數比較深,增加的堆疊處理會影響效能。
Segmentation fault..改寫中
container_of
https://hackmd.io/@sysprog/linux-macro-containerof
http://adrianhuang.blogspot.com/2010/01/linux-kernel-containerof.html
https://myao0730.blogspot.com/2016/09/linuxcontainerof-offsetof.html
https://zhuanlan.zhihu.com/p/54932270
https://www.gushiciku.cn/pl/ggOa/zh-tw
https://blog.csdn.net/wukongmingjing/article/details/81746071
不用花太多時間 Google 搜尋,大部分需要細讀的材料,我已經列在教材和作業說明中,請確保你閱讀「每一段落」及其指向的「每個」超連結。