# Why we need function designator [何為 function designator 及運作模式](https://hackmd.io/@justapig9020/2019q3_week1#第一週-測驗-三) 閱讀 c 語言規格書時,對於 ``function designator`` 產生懷疑並進一步探討。 ``function designator`` 會將 ``function returning type`` 型態視為 ``pointer to function returning type`` ,最直接的表現就是 function call 時只需要寫 ``func ();`` 而不用 ``(&func) ();`` referernce: C99 [6.5.2.2] 在與教授討論時,教授提出了以下程式碼 ``` cpp #include <stdio.h> int main(void) { int (*fptr)(void) = main; printf("main=%x, &main=%x, fptr=%x, &fptr=%x\n", main, &main, fptr, &fptr); } ``` 執行結果 ``main=4222f20, &main=4222f20, fptr=4222f20, &fptr=eb9dd920`` 假設沒有 ``function designator`` 且上述程式合法的話, ``&fptr`` 在 ``address of fptr`` 或是 ``address of main`` 上會產生歧義。 此外若不讓 funciton returning type 被視為 pointer to function returning type 則會產生可以直接存取可執行區段的問題 - without function designator ``&funtion => function |.text|`` - with function designator ``function:=&function => address|.text|`` 由上表可以發現,如果允許存取 ``funciton returning type`` ,意味著可以存取到 function 的內容,這件事是既無意義,更存在風險的。 總結以上關於 ``function designator`` 我得出兩點結論 1. 去除歧異並簡化不直覺的程式碼 2. 限制並保護無意義且具風險之操作 ## 實驗與延伸 嘗試模擬沒有 ``funciton designator`` 的[實驗](https://github.com/justapig9020/function-context-leak-test) 延伸閱讀 [direct call v.s. indirect call](https://gist.github.com/rianhunter/0be8dc116b120ad5fdd4) ###### tags: `sysprog2019`