问题标签 [control-flow-graph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
130 浏览

function - 不同IDA Pro版本中不同的函数长度和控制流程图

我正在尝试分析 IDA Pro 中 x86 .so 库中的函数。我在一台机器上有 IDA Pro 7.1,在另一台机器上有 IDA Pro 6.8。两个版本之间的函数长度和相应的控制流图(Graph View 和 WinGraph32)是不同的。

在 6.8 中,功能要大得多,并以通常的序言开始

但在 7.1 中,函数结束得更早,并且 6.8 仍然认为是相同函数的其余内存空间被拆分为其他函数。但是,这些函数没有通常的序言。

可能值得注意的是,我正在分析的函数可能会被混淆,因此序言/结尾指令序列可能会被其他内容替换。这会影响 IDA Pro 检测函数的方式吗?

我应该相信哪一个?

0 投票
1 回答
1086 浏览

python-3.x - 如何获得程序的控制流程图?

我想获得代码/程序的控制流图(无论是任何编程语言并给出其语法)。我曾尝试在 python 中使用lark 库来解析一个基本的 C 示例程序 [我为 lark 提供了基本 c 语法的语法]。结果,它给了我一个解析树或类似东西的对象,现在我想知道从哪里开始。

话虽如此,任何一种新方法都受到高度赞赏。主要目标是在给定编写语言的语法的情况下获得代码/程序的控制流图。

0 投票
1 回答
1279 浏览

graphviz - 如何通过消除蛇行和更好的边缘交叉来影响 Graphviz/dot 以制作更好的控制流图?

我正在为 Python 程序绘制控制流图,并且想影响不应该跨越哪种边缘。有没有办法做到这一点?

考虑这个简单的 Python 程序:

还有一个点程序来表示通过https://github.com/rocky/python-control-flow/生成的控制流

dot 为上面产生的图像是在此处输入图像描述

请注意一条线是如何蜿蜒而下并穿过一个直箭头的。相反,我宁愿没有一个笔直的向下箭头会被越过。花键边缘会形成更好的交叉位置。

如果你看点,我有两个不可见的向下边缘,用于对齐。(在字节码中,这些遵循线性指令序列)。

因此,如果需要越过一条向下的直线(而这里不需要),则不可见的边缘将优于可见的边缘。

想法?

编辑

到目前为止,一个很好的答案建议更改定义边缘的顺序,并在某些情况下指定应该进行边缘连接的位置。

在这个应用程序中,我确实有来自支配树的分层嵌套信息,并且我可以对边缘进行分类:循环的边缘、跳转到复合结构末尾的边缘、打破循环的边缘等等。

所以现在问题变成了如何使用这些信息来避免那些蛇形箭头,并确保循环中断优先于跨越边缘而不是说“if”/“else”跳转边缘。

这感觉就像 VLSI 设计:提出一组适用于每种(控制流)结构的模式,然后这些模式将正确嵌套和排序。

我已经尝试过边缘排序和放置,我只是没有直观的感觉什么时候应该早点或晚点放东西。

非常感谢结构化控制流边缘的指导或更好的设计规则。

0 投票
2 回答
1828 浏览

c# - 使用 .Net 编译器 Roslyn 为 c# 代码创建控制流图

我找不到使用 Roslyn 为 c# 代码构建控制流图的方法。

我知道 Roslyn 编译器中有一个名为“Microsoft.CodeAnalysis.FlowAnalysis”的命名空间,其中包含一些用于创建控制流图的类,但我不知道如何使用它。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.flowanalysis?view=roslyn-dotnet

有一个名为 ControlFlowGraph.cs 的类,但问题是我无法从该类创建对象或子类。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.codeanalysis.flowanalysis.controlflowgraph?view=roslyn-dotnet

如果有人知道如何使用这个命名空间来构建控制流图或者有一个例子可以使用,请。谢谢你

0 投票
1 回答
223 浏览

c# - Roslyn:从基本块获取指令

roslyn中生成的控制流图包含块(basicblock)作为节点,每个basicblock包含一条或多条指令。对于包含多个指令的基本块,我尝试获取所有指令及其类型,这就是我所做的:

对于以下方法:

我得到结果:

但我想得到确切的指令,它是x = y; 我想要得到的指令的类型AssignmentExpressionSyntax。另外我想根据它的类型对每条指令执行一些操作。

0 投票
1 回答
51 浏览

g++ - 在 G++ 的 cfg 输出中,“bb”是什么?

我正在探索 g++ 的 cfg 工具的一些输出。我想我理解“bb”的作用——它是 goto 语句的标签,对吧?bb代表什么?g++ 是否有任何其他方式标记要去的地方?

0 投票
0 回答
623 浏览

java - Java 代码的控制流图生成

我正在制作一个从 Java 源代码生成和可视化控制流图的工具

我正在制作一个项目,它将逐行读取 Java 源代码,然后生成代码的控制流图,然后将其可视化。但我不知道该怎么做,我的老师告诉我要学习 DOT 来做这个过程,但我很困惑。

有人可以告诉我实现我刚才描述的目标的步骤和方法吗?

0 投票
2 回答
1728 浏览

c# - 如何在控制流图中表达 Try/Catch?

我正在尝试计算一些Cyclomatic Complexity,因此尝试绘制控制流图。首先,我试图使其成为一种相当简单的方法。

首先,我尝试仅将其绘制为这样的尝试部分: 流程图

方法如下:

我将如何扩展它以包含整个方法和尝试部分?

这是我的第一个控制流图,所以如果我搞砸了,我也想知道。

0 投票
0 回答
137 浏览

java - 如何将 eclipse-cdt codan 生成的控制流图保存为文件(最好是 PNG 或 JPEG)?

我想将 eclipse-cdt codan 从一些 C 源代码中生成的控制流图保存为 png/jpeg 文件。我在我的代码中使用 codan 作为库,所以它不是 eclipse 插件。到目前为止,我已经能够使用下面的代码成功获取 cfg。

这样做,我有一个builder包含控制流图节点。问题是如何获得该图的输出图像。库中codan包含一个org.eclipse.cdt.codan.ui.cfgview。但我找不到任何解决我的问题的方法。我发现 cfgview 中的文件严重依赖 Eclipse 工作区和环境。

0 投票
2 回答
521 浏览

c++ - 如何使用clang仅获取主要功能的AST

我想在源文件中获取 main 函数的 AST(假设有一个)来构建控制流图。我在这里找到了生成和遍历 AST 的代码: https ://shaharmike.com/cpp/libclang/ 。但问题是它进入了所有包含的文件。我还找到了这个主题:Clang AST visitor, Avoid traversing include files。但似乎在 clang10 中进行了一些更改,建议的解决方案现在不起作用。或者也许还有其他方法可以获取 AST 来构建控制流图?唯一的要求 - 它必须工作 C++ 源代码。