Wednesday, February 1, 2012

GNU GLOBAL - 程式碼分析 - cross reference 的分析工具

GNU GLOBAL - 程式碼分析 - cross reference 的分析工具
by thinker
2 Columns
關鍵字:
程式碼分析
GNU GLOBAL 是類似於 ctags 的工具,用以建立 source code 符號定義位置的 database 。除了符號定義之外,global 還建立符號 xref (cross reference) 的 database ,用以快速查詢 xref 的位置,是個很方便的設計。

查詢 xref 位置的功能,讓使用者能很快的得知何處使用某個指定的符號,可用以確定符號名稱更改時,是否有漏網之魚。或者,也可透過 xref ,以了解符號在系統中的作用、角色。

除了建立 tag 和 xref database 之外, global 提供將程式碼轉成 HTML ,並依 xref 產生 link 的能力。然而,這方面的功能, doxygen 應該更為成熟,輸出的結果也更為美觀。

除此, global 還提供 vim 、 nvi 、 emacs 甚至是 bash 和 less 的查詢介面。透過 editor 查詢的功能就不用說了,和 bash 整合,提供簡短的指令,能快速的查詢、瀏灠程式碼。例如:

[/usr/src/sys] x main
> 1 main 70 alpha/alpha/gensetdefs.c main(in
2 main 1500 alpha/alpha/ieee_float.c main(i
3 main 227 boot/alpha/boot1/boot1.c main()
[/usr/src/sys] show 3
(Load editor and show boot/alpha/boot1/boot1.c at line 227.)

這個範例是在 bash 下,查詢有哪些位置定義了 main function ,查詢的結果列出了三個 main function 。接著 show 第三個 main function 的內容,也就是執行 editor (vi 或其它) 顯示該段程式碼。除此之外,還提供 bash 下的 bookmark 等等的功能。

至於 less 的整合,也提供了一些有趣的功能。例如:

$ less -t main
main(int argc, char **argv)
{
int i;
.....
[xxx/main.c (tag 1 of 55)]

執行 less 以顯示 main function 的內容。

我之所以介紹 GNU GLOBAL ,是因為我在最近的程式碼分析研究當中,以 global 為基礎,對程式碼的 cross reference 進行分析。分析的結果,能幫助我們了解 module 在系統中的作用和關聯性。這對經常在看別人程式碼的 open source 的 programmer 非常的重要,在不確定 module 的關聯性時, programmer 往往是處於傍偟和猶豫當中,遲遲不敢動手。 cross reference 的分析工具,讓 programmer 快速掌握 module ,減少猶豫的尷尬階段。

Reference:
http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/258

No comments: