问题标签 [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.
linux-kernel - 为 Linux 内核二进制构建完整的控制流图
是否有任何工具可以为整个 Linux 内核二进制文件构建控制流图?例如,考虑为 x86 架构编译的 Linux 内核(vmlinux 文件)。是否可以仅使用静态分析来确定所有执行路径(忽略间接分支或其他需要运行时信息的控制流)?有没有适合这个的工具?
llvm - LLVM 中基于机器代码的控制流图
LLVM 通常为其中间表示 (IR) 语言提供控制流图 (CFG)。您还可以轻松获得基于源代码的高级 CFG。我想获得机器代码级别的 CFG。有没有办法得到这个?
我做了一点挖掘。在 LLVM 的后端代码生成阶段,有一个称为SSA-based Machine Code Optimizations的阶段。这个阶段的信息不多。但是,我猜 LLVM 在某个中间阶段会生成基于 SSA 的机器代码。如果存在这样的阶段,那么我们可以根据该阶段的代码来制作基本块。使用这些基本块,可以在该阶段创建 CFG。lib\CodeGen
任何人都可以提供关于我必须在 LLVM 源代码树(可能在)中查找的任何信息的源文件的任何线索吗?或者class
那会给我基于 SSA 的机器代码演练和基本块?我将不胜感激任何指针。
code-analysis - 我可以使用 JDT 生成控制流图吗?
JDT 是否提供任何 API 来生成控制流图?我使用soot生成控制流图,但是我可以使用JDT生成控制流图吗?
c# - GNU Radio 编程模式/控制流图
我即将开始开发一个应用程序(可能在 C# 中),它具有与 GNU radio 相似的机制,但目的完全不同。
GNU Radio 有一个类似于典型流程图类型编辑器/绘图工具的 GUI,但“画布”上显示的每个对象都是反应式控制流图(而不是流程图框)的一部分。
基本上,它们是黑匣子,每个都有特定的内部用途,并且每个都在需要时具有输入和输出。
为了解释的简单,假设我的范围是创建一个 GUI 画布,我可以将对象拖到上面和一个运行/停止按钮(运行“程序”)。我想在某些方面有点像编程 Scratch 儿童编程工具中的 GUI。
我最初有 3 个对象。
1)某种类型的键盘输入框,我将在其中输入一些 Base64 编码的文本。这只有一个进入对象编号 2 的输出。
2)这个对象接受输入给它(上面的编码文本)并将其转换回 UTF-8(它的唯一目的)并将其输出到对象号 3。
3) 这个对象接受输入给它的输入(来自对象编号 3)并将其输出到屏幕(在它的小盒子里)。
这些对象做什么并不重要,这只是举例。这基本上是 GNU Radio 的工作方式,除了它传递数字信号数据而不是文本。
我的问题是 GNU radio 使用什么样的编程模式(在我把它拆开之前)或者我应该通过寻找这种类型的应用程序来寻找什么样的 OOP 类型模式或想法。甚至是一些好的谷歌链接。
我已经尝试了几个小时,现在试图在谷歌上搜索一些东西,但是真的很难找到合适的词,这些词不会返回数以万计的用于销售流程图软件的广告等。
我还应该补充一点,以后可以添加新对象(黑框)。
python - 如何准确地可视化程序主路径的最后一个命令之后发生的情况?
我一直在绘制解释基本编程概念的教育漫画。此刻,我正在做一个关于控制流的,一个领域让我大吃一惊:计算机在完成控制流中程序最终主路径的所有命令之后会做什么。
我以为它会“退出”程序作为结束它的一种方式,但其他消息来源非常被动地说,“程序退出计算机。” 这部分对我来说听起来很奇怪,因为当我可视化控制流时,计算机正在一个接一个地执行命令,直到它遇到某种程序的“结束”。
这是我的工作草稿,用于解释我正在处理的内容:
https://prairieworldcomicsblog.files.wordpress.com/2018/03/controlflowpencil.pdf
在这部漫画的结尾,在这里形象化这个“结局”的最佳比喻是什么?
assembly - 在基本块中间跳转
基本块定义为以跳转(直接或间接)指令结尾的(非跳转)指令序列。跳转目标地址应该是另一个基本块的开始。考虑我有以下汇编代码:
bb1
第一个基本块 bb1 有一个目标地址,它是 bb4 的开始。
bb2
第二个基本块 bb2 有一个间接分支,因此目标地址仅在运行时才知道。
bb3
第三个基本块有一个目标地址,它不是另一个基本块的开始,而是在 bb2 的中间。根据基本块的定义,这是不可能的。但是,在实践中,我在多个地方看到了这种行为(在基本块的中间跳跃)。如何解释这种行为?是否可以强制编译器(LLVM)生成除了基本块开头之外不会跳转到其他任何地方的代码?
bb4
我正在使用工具(SPEDI)生成基本块,使用的编译器是 LLVM(CLANG 前端),目标架构是 ARM V7 Cortex-A9。
c - 如何在 gcc 的 -fdump-tree 上使用“graph”选项?
.gcov
我正在尝试查看 gcc 是否可以提供更多信息,我可以使用这些信息从 C 源代码创建控制流图,然后使用它来检查 Gcov输出中执行的测试用例所采用的路径。到目前为止,我最好的候选人是使用-fdump-tree-cfg
with lineno
option ( -fdump-tree-cfg-lineno
),但结果文件对我来说仍然是有限的,因为每个函数的节点信息都是分开的。像这样的东西:
这意味着我的解析器需要识别函数内部的每个函数调用main
,然后合并它们的节点信息,这对我来说是一项非常艰巨的任务。
所以我从这个文档-graph
中找到了这个选项,但我不知道如何使用它。正如文档描述的那样:-fdump-tree
我不知道 GraphViz 是如何工作的,但由于它能够将所有函数的子图呈现为单个图(我假设这意味着所有子图都与主图合并为单个图),这意味着提供的信息-graph
更多完成并简化创建控制流图的过程。
由于我无法理解它的含义,因此我尝试按原样使用该选项 ( -fdump-tree-cfg-lineno-graph
),但结果仍然与-fdump-tree-cfg-lineno
's 结果相同。
我该如何使用它?
compiler-construction - LLVM 中是否存在 MachineFunction CFG 和 IR Function CFG 的一对一映射?
您可以在 LLVM IRFunction
级别和 CodeGenMachineFunction
级别拥有 CFG。这是一对一的映射吗?我的意思是,在那些具有相似控制流的 CFG 中是否有相同数量的(Machine)BasicBlock
s?我知道指令的数量可能会因为明显的原因而有所不同,但我很想知道结构是否保持不变。
algorithm - 进/出活变量计算算法说明
这张幻灯片显示了用于计算in[n]
和out[n]
控制流图节点的算法。我很难理解它是如何工作的。我已经看到了一些其他的变化,也很难理解它们。我以前从未处理过定点的东西。
问题是,这个算法在做什么/对它的更直观的解释。我不明白什么in'
和out'
是,以及结束条件是什么意思(until in'...
)。不遵循嵌套循环。我对 JavaScript 实现的尝试显示了我缺少的部分:
任何帮助将不胜感激。谢谢你。
c - 如何从此代码中绘制控制流图?
如何从此代码中绘制控制流图?如果有人可以展示该过程,我将不胜感激。我可以从一个非常简单的案例中得出 CFG,但我不能做到这一点。我还需要确定基础路径和多个条件标准的测试。这不是家庭作业问题,我只是尝试理解课程材料。谢谢。