跳轉到內容

GNU C 編譯器內部/GCC 駭客

來自華夏公益教科書

像 C++ 中那樣進行函式過載

[編輯 | 編輯原始碼]

此示例以前曾介紹過。

像 Java 中那樣為每個結構提供 toString() 方法

[編輯 | 編輯原始碼]

像 Ruby 中那樣從函式中呼叫程式碼塊

[編輯 | 編輯原始碼]

Linux 中的列表實現允許在列表的每個元素上呼叫程式碼塊。

pagelist.c:

       list_for_each_prev(pos, head) {
                struct nfs_page *p = nfs_list_entry(pos);
                if (page_index(p->wb_page) < pg_idx)
                        break;
       }

list_for_each_prev 將括號中的程式碼作為引數。技巧是使用一個宏,該宏展開成一個 for() 迴圈,其迴圈體成為括號中的程式碼。該專案的目的是允許程式設計師在函式呼叫中使用程式碼塊。

當返回結構時,解除引用函式結果

[編輯 | 編輯原始碼]

C 允許解除引用函式的返回值,如果它是指向結構的指標。

 get_struct()->field=0;

如果函式返回結構本身,而不是指向它的指標,則會生成編譯時錯誤。

 get_struct().field=0;
 > request for member `field' in something not a structure or union

此擴充套件解決了解除引用作為返回值的結構的問題。

使用函式初始化變數

[編輯 | 編輯原始碼]

當定義並初始化變數時,初始化器是常量。如果嘗試使用函式,無論該函式是什麼,都會出現錯誤。

 int getint() { return 1; }
 int i=getint();
 > initializer element is not constant

當使用變數時,會呼叫它使用初始化的函式。

像 C++ 中那樣設定函式引數的預設值

[編輯 | 編輯原始碼]
 void func(int a=0) {
   printf("a=%d\n", a);
 }
 int main() {
   func();
 }
 > syntax error before '=' token

像 C++ 中那樣使用引用引數

[編輯 | 編輯原始碼]
 void test(int &a, int &b);
 int x,y;
 test(x,y);

返回地址保護 (RAD)

[編輯 | 編輯原始碼]

Rad

修復控制劫持攻擊 (DIRA)

[編輯 | 編輯原始碼]

Dira

使用分段硬體進行陣列邊界檢查 (CASH)

[編輯 | 編輯原始碼]

Cash

檢測整數溢位 (DIVINE)

[編輯 | 編輯原始碼]

Divine

在使用者空間開發,在核心中安裝 (DUSK)

[編輯 | 編輯原始碼]

Dusk

動態資訊流跟蹤 (GDIF)

[編輯 | 編輯原始碼]

Gdif

目標檔案中的 GCC 開關

[編輯 | 編輯原始碼]

目標檔案中的 GCC 開關

-fstack-protector 功能

[編輯 | 編輯原始碼]

GCC 4.1 實現了一種針對緩衝區溢位攻擊的保護機制,並透過 -fstack-protector 選項將其公開給程式設計師。這是一個模組化實現受益的功能示例,因為它與編譯器的核心功能無關。GCC 是否有足夠的鉤子來實現 -fstack-protector 模組?

上一個: C 中的函式過載 GCC 駭客 下一個: 連結
華夏公益教科書