我正在寻找用 C++ 编写的源代码的控制流图生成器。您知道任何开源静态生成器吗?
我想在我的毕业项目中使用它来生成控制流图并突出显示在分析应用程序执行期间已执行的路径。
我已经编写了整个引擎来记录执行的行。
感谢您的所有回答。
我正在尝试构建一个通过调用objdump -d返回的汇编结果的控制流图.目前我提出的最好的方法是将结果的每一行放入链表中,并将每行的内存地址,操作码和操作数分开.我依靠objdump结果的常规性质将它们分开(内存地址是字符串2到字符串中代表每一行的字符7).
完成后,我启动实际的CFG指令.CFG中的每个节点都包含一个起始和结束内存地址,一个指向前一个基本块的指针,以及指向任何子基本块的指针.然后我将浏览objdump结果并将操作码与x86_64中所有控制流操作码的数组进行比较.如果操作码是控制流操作码,我将地址记录为基本块的末尾,并根据操作码添加两个子指针(条件操作码)或一个(调用或返回).
我正在用C实现这个过程,看起来它会起作用但感觉非常脆弱.有没有人有任何建议,或者我没有考虑的任何事情?
感谢您抽时间阅读!
编辑:
我的想法是使用它来比较DynamoRIO生成的系统调用的堆栈跟踪与目标二进制文件的预期CFG,我希望像这样构建它会促进这一点.我没有重复使用可用的东西,因为A)我真的没有关于它和B)我需要将图形转换为可用的数据结构,以便我可以进行路径比较.我将看一下您排行的页面上的一些实用程序,感谢您指出我正确的方向.感谢您的评论,我真的很感激!
我有一类似乎自然采用图形结构的计算.该图远非线性,因为有多个输入以及扇出的节点和需要其他几个节点结果的节点.在所有这些计算中,也可能存在几个接收器.但是,没有任何循环存在.输入节点被更新(不一定一次),我的值通过(此时纯粹是概念上的)图形.当输入改变时,节点保持状态,并且计算必须相对于输入顺序运行.
因为我必须非常频繁地编写这样的计算,并且我每次都不愿意编写ad-hoc代码,所以我尝试编写一个小型库,以便通过编写各种顶点的类来轻松地将这些计算拼凑在一起.然而,我的代码相当不优雅,并没有利用这些计算的并行结构.虽然每个顶点通常都是轻量级的,但计算可能会非常复杂和"宽".为了使问题更加复杂,这些计算的输入在循环中非常频繁地更新.幸运的是,问题的规模足够小,我可以在一个节点上处理它们.
有没有人曾经处理类似的事情?您会推荐哪些想法/方法/工具?
我想使用 C 语言从汇编文件创建控制流图(CFG)。我一直在思考这个问题,这些是我的想法: 1.创建块 - 逐行处理汇编文件 - 找到重要的指令,如函数名称、块名称、跳转指令、调用指令或 left/ret 以及其他一些指令 - 找到它们也许用正则表达式?但我还没有在 Windows 上找到 C 的正则表达式实现。- 匹配上述指令后,在匹配某些结构之前保存指令,这是我的块 2. 创建 CFG - 不知如何从块创建 CFG,但我不知道
谁能给我一些建议如何去做?另外,如果有更好的语言可以做到这一点,如果您告诉我,我将不胜感激。
感谢您的时间和帮助。
我想在 CFG 中找到所有可能的线性独立路径。根据我对算法的有限了解,CFG 本质上是一个包含循环的有向图。圈复杂度的公式很简单。我想知道是否有办法获得从开始到结束节点的所有线性独立路径(由圈复杂度给出)
谢谢!
我正在尝试通过检查我当前的代码覆盖百分比来改进我的单元测试.我正在使用gcov和lcov生成覆盖结果的HTML报告.但是,我在理解某些输出时遇到了问题.我知道a +
表示已经采取了分支并且-
没有采取分支.
131 : 8 : QString toString() const
132 : : {
133 [ + - ][ + - ]: 8 : return ((negative && !isZero()) ? "-" : "") + QString::number(sec) + "." + QString::number(nano).rightJustified(9, '0');
[ + - ][ + + ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
134 : : }
Run Code Online (Sandbox Code Playgroud)
变量negative
的类型为bool,因为是方法的返回值isZero
.所以我希望这里有四个分支,但我不知道输出如何映射到这个期望.那么如何解释输出?悬停在+/-标志上时的工具提示告诉我分支3,6,9,11,12,14,17,20,23和26是在分支4,7,10,15,18,21,24和27人从未被带走过.
我现在正在使用编译器类,我们正处于构建CFG以实现优化的程度.我无法弄清楚的一件事是一个程序有多少CFG?我见过的每个例子似乎都是简单代码段的CGF.所以,如果你有一个程序说三个功能.你是否为每个功能都有一个单独的CFG,或者整个程序有一个大的CFG?
compiler-construction computer-science compiler-theory control-flow control-flow-graph
我一直在阅读本地优化编译器技术,但我一直没有得到它们的实现方式.我们的想法是,优化器每次都会查看代码的"窗口",并以某种方式检测模式并用更优化的版本替换它们.
我的问题是,如何发现这些模式?(假设您的平台是一个虚拟机,可以输出组装计算机的汇编代码,如Schocken的Hack).
人们实际上是手动检查代码(使用控制流图或DAG或其他),然后收集所有识别的模式并将它们编码到优化器中?或者是否有自动方式.
例如,您在分析器中提供要优化的代码,并且它会喷出所述模式.如果是这样,怎么开始写一个呢?
compiler-construction design-patterns control-flow-graph vm-implementation peephole-optimization
有没有来自LLVM社区的人知道是否有办法为整个输入源代码生成CFG使用opt -dot-cfg foo.ll(.bc)
?因为这个每个功能产生CFG,因此功能之间的连接将被忽略.
旧的分析工具似乎已经贬值了.