Try   HackMD

2018q3 第 4 週測驗題 (下)

目的: 檢驗學員對前 3 週課程的認知


測驗 3

以下程式碼編譯並執行後,在 x86_64 GNU/Linux 會遇到記憶體存取錯誤:

$ cat ptr.c
int main() {
    int *ptr = 0;
    return *ptr;
}
$ gcc -o ptr ptr.c
$ ./ptr
Segmentation fault: 11

分別考慮以下 4 個程式,探討其行為。

  • ptr1.c
int main() { return *((int *) 0); }
  • ptr2.c
int main() { return &*((int *) 0); }
  • ptr3.c
#include <stddef.h>
int main() { return &*NULL; }
  • ptr4.c
#include <stddef.h>
int main() {
    return &*(*main -  (ptrdiff_t) **main);                                                                                                                  
}

作答區

K1 = ?

  • (a) ptr1.c 在執行時期會造成 Segmentation fault
  • (b) 對於 ptr1.c, C 語言規格書聲明這是 undefined behavior 或者語法錯誤
  • (c) ptr1.c 是合法 C 程式,在執行後可透過 echo $? 得到 exit code 為 0

K2 = ?

  • (a) ptr2.c 在執行時期會造成 Segmentation fault
  • (b) 對於 ptr2.c, C 語言規格書聲明這是 undefined behavior 或者語法錯誤
  • (c) ptr2.c 是合法 C 程式,在執行後可透過 echo $? 得到 exit code 為 0

K3 = ?

  • (a) ptr3.c 在執行時期會造成 Segmentation fault
  • (b) 對於 ptr3.c, C 語言規格書聲明這是 undefined behavior 或者語法錯誤
  • (c) ptr3.c 是合法 C 程式,在執行後可透過 echo $? 得到 exit code 為 0

K4 = ?

  • (a) ptr4.c 在執行時期會造成 Segmentation fault
  • (b) 對於 ptr4.c, C 語言規格書聲明這是 undefined behavior 或者語法錯誤
  • (c) ptr4.c 是合法 C 程式,在執行後可透過 echo $? 得到 exit code 為 0

延伸問題:

  1. 參照 C 語言規格書,充分解釋其原理
  2. 解析 clang/gcc 編譯器針對上述程式碼的警告訊息
  3. 思考 Segmentation fault 的訊息是如何顯示出來,請以 GNU/Linux 為例解說。提示: Page fault handler