今天在這裡和大家分享一下如何獲取c++文件中的函數列表,問題和靈感來自於同事小W自開發的C++代碼覆蓋率工具,原理是通過給現有的代碼進行打樁,在運行到該函數的時候對該函數進行標記,最終統計得到代碼的函數覆蓋度。
如圖:程序的源代碼
經過打樁後的代碼
原理大致如下,這裡就不給大家詳細介紹了。
那麼問題的重點來了,如何解析並且獲取cpp文件中的函數呢?
首先想到的方法是的利用編譯原理的思想通過添加規則的方法去獲取函數,如:對“{”,“}”,“(”,“)”進行字符匹配來判斷一個函數的開始和結束。最開始頗有成效,可以款速的分下簡單的代碼,但是隨著在輸入法項目中的實戰應用出現的問題越來越多。如圖,在函數的聲明的時候使用了宏定義的情況下對函數判斷失敗
1. 函數定義中包含宏的情況,沒有辦法識函數名。
2. 函數內部如果使用了宏定義可能會出現括號不匹配的情況導致死循環的出現。
等等,隨著在項目中的不斷深入出現各種各樣復雜的環境引發的問題,再對這些問題添加規則規避的同時還可能引發新的問題。每次因為修改問題又引發新問題的同時近乎崩潰!!!
於是乎我們可能需要尋找一種新的方法去得到cpp文件中的函數。靈感一來自於notepad++它是如何對函數進行解析的呢?調研發現notepad++可以使用插件function list對cpp文件進行解析,萬幸這個插件是提供源碼的!!!發現notepad++解析cpp文件也是按照一定的規則來做的,如圖:
這樣我們只需要把插件重新打包成一個dll文件在我們的工程中使用就可以滿足我們的需求了,這樣做的優點是節省了我們去編寫各種各樣的規則,不足之處是對於我們奇葩的代碼它還是有無法識別的函數,而且最重要的是我們還不知道如何添加規則,oh my gad!
僅僅為了獲取函數名,就在函數體中嵌入硬編碼的字符串,這種方法單調乏味還易導致錯誤,不如看一下怎樣使用新的C99特性,在程序運行時獲取函數名吧。答案是:使用__FUNCTION__ 及相關宏。如圖:通過宏定義獲取函數名。
這種方法雖然可行,但是還有一些技術問題沒有突破,待小編解決後下次給大家分解。