2013-05-06 76 views
8

我正在構建用於測試ansi c應用程序的工具。只需加載代碼,查看控制流程圖,運行測試,標記所有命中的頂點。我試圖通過解析代碼自己構建CFG。不幸的是,如果代碼被嵌套,它會變得混亂。 GCC提供從編譯代碼獲取CFG的能力。我可能會爲其輸出編寫解析器,但我需要行號來設置斷點。在輸出控制流程圖時,是否可以通過-fdump-tree-cfg-fdump-tree-vcg獲取行號?從ANSI C代碼獲取控制流圖

+0

[工具獲取圖形函數調用圖代碼]可能的重複(http://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code ) – 2016-04-12 19:48:06

回答

6

所以我做了一些更多的研究,並且不難得到節點的行數。只需將lineno選項添加到其中一個選項即可獲得。所以請使用-fdump-tree-cfg-lineno-fdump-tree-vcg-lineno。我花了一些時間來檢查這些數字是否可靠。在的情況下,VCG格式標籤的每個節點包含兩個數字。這些是由該節點表示的代碼部分開始和結束的行號。

15

對於C程序,你可以看一下現有的Python解析器C的控制流圖:

調用圖是控制流圖的密切相關的構造。 有幾種方法可用於爲C代碼創建調用圖(函數依賴關係)。 這可能會證明對控制流圖生成的幫助。 方式在C創建依賴圖:

  • 使用cflow

    • cflow的+ pycflow2dot + dot(GPL,BSD)cflow的是穩健的,因爲它可以處理代碼不能編譯,例如缺少包括。如果大量使用預處理器指令,則可能需要使用--cpp選項來預處理代碼。
    • 的cflow + cflow2dot +點(GPL V2,V3 GPL,Eclipse公共許可協議(EPL)V1)(注意,cflow2dot需要一些路徑固定它的工作原理之前)
    • 的cflow + cflow2dot.bash(GPL V2,?)
    • cflow的+ cflow2vcg(GPL V2,GPL V2)
    • enhanced cflow(GPL V2)與列表從圖表
  • 排除符號使用cscope

  • ncc(CFLOW喜歡)

  • KCachegrind(KDE依賴查看器)
  • Calltree

以下工具不幸的是需要將代碼編譯,因爲它們依賴於輸出GCC:

  • CodeViz(GPL V2)(薄弱點:需要編譯源,因爲它使用gcc轉儲cdepn文件)
  • gcc + egypt + dot(GPL v *,Perl = GPL |藝術品許可證,EPL v1)(egypt使用gcc生成RTL,因此無法使用任何錯誤的源代碼,或者甚至在您只想關注來自大型項目的單個文件的情況下使用。因此,它與更強大的cflow爲基礎的工具鏈。需要注意的是埃及在默認情況下良好的支持,但不包括從圖形庫調用,使之清潔。

此外,對於C/C++文件的依賴關係圖可以crowfood創建。

+0

調用圖不是我所需要的。我需要代碼中的可視分支。我必須在代碼中向用戶顯示所有循環和決策點。我爲VCG製作了自己的解析器,但我會檢查您發佈的工具。 – Eloar 2013-07-25 08:35:59