Try   HackMD

2023q1 Homework5 (assessment)

contributed by < POCHUN-CHEN >

L08: assessment

專案與作業

lab0-c

  1. 有把 Git 方面的講義看完,對於版本控制有更多的知識,之後會更加注意 Commit 撰寫。
  2. 在編碼方式有做了不少努力,除了成大 wiki 上的講義,也有看了 CSAPP 第二章後面的部份題目。
  3. 加強對於指標與 linked list 的知識與應用,之前在撰寫 lab0-c 很多都是霧裡看花,雖然讀完講義後懂的東西更多,但目前也知道我還沒真的懂(還無法對於程式碼的缺失進行改進)。
  4. 預計會持續盡力完成 lab0-c 之作業要求。

在講義mergeTwoLists()中,

struct ListNode *mergeTwoLists(struct ListNode *L1, struct ListNode *L2) { struct ListNode *head = NULL, **ptr = &head, **node; for (node = NULL; L1 && L2; *node = (*node)->next) { node = (L1->val < L2->val) ? &L1: &L2; *ptr = *node; ptr = &(*ptr)->next; } *ptr = (struct ListNode *)((uintptr_t) L1 | (uintptr_t) L2); return head; }

第 4 行的 *node = (*node)->next 左右式的資料型別是不同的,struct ListNode 應改成 struct list_head ,之後再使用 element_t *L1_entry = list_entry(L1, element_t, list); 取得內含值結構體 element_t 的參數 L1_entry 方便比較大小排序。

fibdrv

在寫大數的時候發現困難重重,經過與老師一對一討論後,詳讀前三週課程(目前看到第二週),之前的疑問有很多都知道該如何處理(但實做後才能驗證自己是否掌握)。預計看完第三週講義後,會進入 fibdrv 實做。

quiz

目前學習模式

課堂問題

  1. 運用 bit-wise operator中,
  • C 語言中,x & (x - 1) == 0 的數學意義
    • power of two :代表上式能檢查
      2n
    • signed v.s. unsigned :有無號如何跟上式有關係呢?

x & (x - 1) 運算後的結果是把二進位的最右面那個 1 變成 0 ,除了可以檢查二進位數值中有幾個 1 位元、檢查是否為

2n,還有沒有更深層的理解呢?

signed v.s. unsigned :有無號如何跟上式有關係呢?

  1. Integer Overflow 案例分析的 2002 年 FreeBSD [53]例子中,把「負」的數值作為 maxlen 帶入,由於 memcpy(user_dest, kbuf, len);len 是 unsigned ,故該「負」的數值,會表示成一個很大的正數值,在此刻,輸入參數就會是錯誤的,導致記憶體位置錯誤。

為什麼強調「負」的數值,如果是錯誤的len 數值,應該就會導致輸入參數會是錯誤,導致程式有問題。況且原文中提到「懷有惡意的程式設計師」,是否不只是程式錯誤的問題?還會引發更嚴重的問題呢?(例如可以存取到特定的記憶體位置內部的資料)

  1. 跟你想像不同的 struct 中, &((TYPE *)0)->MEMBER 把地址 0 轉形成函式指標,利用 0 指到 MEMBER 的大小當成 offset 的值。

編譯器處理 &((TYPE *)0)->MEMBER 時,不會真正去存取地址為 0 的記憶體區段,那背後到底是如何運作(都不真的 0 了)?

  1. Linked list 在 Linux 核心原始程式碼應用案例: 雙向環狀鏈結串列之中(兩者內容一致),對於 list_for_each 的程式碼定義與圖示如下
#define list_for_each(node, head) \
    for (node = (head)->next; node != (head); node = node->next)






ele_list



h

head



e1

head node

prev

next



h->e1:w





e2

cat

prev

next



e1:e->e2:w






e3

...



e2:e->e3:w






e4

eat

prev

next



e3:e->e4:w






e5

fat

prev

next



e4:e->e5:w






e5:e->e1:w






是否應為下圖才比較合理?







ele_list



h

head



e1

head node

prev

next



h->e1:w






e2

cat

prev

next



e1:e->e2:w






e3

...



e2:e->e3:w






e4

eat

prev

next



e3:e->e4:w






e5

fat

prev

next



e4:e->e5:w






e5:e->h:w






  1. list_entry中提到,

這時可以查詢到 list_entrycontainer_of 等價的包裝,符合以 list_ 開頭的命名慣例,此處的 entry 就是 list 內部的節點。

特別注意:在 list_ 系列的 member 都限定在 list_head member

如果 list_ 系列的 member ,故意輸入 struct 中,不是 list_head member 的成員,應該會發生錯誤?該如何防呆?

紀錄閱讀〈因為自動飲料機而延畢的那一年〉的啟發