我正在構建用於測試ansi c應用程序的工具。只需加載代碼,查看控制流程圖,運行測試,標記所有命中的頂點。我試圖通過解析代碼自己構建CFG。不幸的是,如果代碼被嵌套,它會變得混亂。 GCC提供從編譯代碼獲取CFG的能力。我可能會爲其輸出編寫解析器,但我需要行號來設置斷點。在輸出控制流程圖時,是否可以通過-fdump-tree-cfg
或-fdump-tree-vcg
獲取行號?從ANSI C代碼獲取控制流圖
8
A
回答
6
所以我做了一些更多的研究,並且不難得到節點的行數。只需將lineno
選項添加到其中一個選項即可獲得。所以請使用-fdump-tree-cfg-lineno
或-fdump-tree-vcg-lineno
。我花了一些時間來檢查這些數字是否可靠。在的情況下,VCG格式標籤的每個節點包含兩個數字。這些是由該節點表示的代碼部分開始和結束的行號。
15
對於C程序,你可以看一下現有的Python解析器C的控制流圖:
- PyCParser
- pycparser
- pyclibrary(的pyclibrary叉)
- joern
- CoFlo C/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)與列表從圖表
- cflow的+ pycflow2dot + dot(GPL,BSD)cflow的是穩健的,因爲它可以處理代碼不能編譯,例如缺少包括。如果大量使用預處理器指令,則可能需要使用
排除符號使用cscope:
- cscope的(BSD)
- cscope + callgraphviz + dot + xdot
- cscope + vim CCTree(C Call -tree資源管理器)
- 的cscope + ccglue
- 的cscope + CodeQuery爲C,C++,Python的&爪哇
- 的cscope + Python html producer
- 的cscope + calltree.sh
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
相關問題
- 1. C# - 獲取字符的ANSI代碼值
- 2. 從C代碼控制shell?
- 3. 從控制檯讀取Unicode/ANSI
- 4. 代碼點火器從視圖到控制器獲取ajax值
- 5. 如何爲C代碼生成控制流程圖
- 6. 控制流圖發生器的C#代碼
- 7. 用於C++代碼的控制流圖生成器
- 8. ANSI圖形代碼和Python
- 9. 將ANSI代碼引入流中
- 10. 控制從代碼
- 11. 從C++代碼控制MATLAB dll
- 12. 從C代碼打開Linux控制檯
- 13. 獲取電流控制器和行動從局部視圖
- 14. 從抽象句法樹中獲取控制流程圖
- 15. 數據流和控制流程圖C
- 16. C#代碼在試圖從網絡流中讀取時掛起
- 17. 從R控制檯獲取密碼
- 18. 獲取根視圖控制器 - Objective-C
- 19. 從ControlTemplate獲取代碼的控制按名稱
- 20. 如何從鉻控制檯中獲取錯誤代碼
- 21. 如何從谷歌播放控制檯獲取IAP SKU代碼?
- 22. 從控制器獲取值到Javascript代碼
- 23. 處理iostream操縱器和ANSI控制檯顏色代碼
- 24. 爲什麼ANSI代碼頁和控制檯代碼頁是不同的?
- 25. 獲取從代碼
- 26. 獲取從代碼
- 27. 使用異常來控制代碼流
- 28. 強制男人輸出ANSI代碼
- 29. C++:從URL獲取HTTP狀態代碼
- 30. 從質量中心獲取c#代碼
[工具獲取圖形函數調用圖代碼]可能的重複(http://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code ) – 2016-04-12 19:48:06