从源代码计算可摄取的控制流程图

ins*_*get 7 python graph control-flow

我知道有一些方法可以从源代码自动生成CFG(C ontrol F low G raph).但是,根据我的理解,这些方法给了我一个视觉图形 - 一个图像.我无法真正使用这样的图像进行任何计算.

因此我的问题是:有没有办法从源代码自动生成CFG,以便在一些数据结构或程序可解析的文件中将源代码返回给我?(理想情况下,我也希望能够访问CFG中每个节点/边缘的行号)

我将使用这个用于使用这样的CFG提取控制流路径以确定输入路径覆盖范围的项目(我将使用跟踪解决)

重要:我试图分析的代码是用python编写的; 我想用python执行分析

Rea*_*man 3

问:是否可以使用 llvm 基础设施以基本块的形式获取应用程序的控制流程图?

答:是的,给定一个 BasicBlock*,您可以像这样迭代 CFG 中的 pred/succ 块:

#include "llvm/Support/CFG.h"

   for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
     BasicBlock *OnePredecessor = *PI;
     ...
Run Code Online (Sandbox Code Playgroud)

对于后继者,s/pred/succ/

问:有没有办法查看应用程序的控制流程图。

答:是的,使用:analyze -print-cfg X.(bc|ll) 或:analyze -print-cfg-only X.(bc|ll)

这些将发出“点”文件,可以使用您可以在网上获得的 graphviz 工具集将其转换为各种图形格式。

http://lists.cs.uiuc.edu/pipermail/llvmdev/2005-June/004416.html 这向您展示了如何以编程方式提取 CFG 使用辅助工具将 CFG 打印到控制台。