标签: control-flow-graph

如何使用 antlr 生成 Java CFG(控制流图)?

我正在尝试分析 Java 代码结构。

所以,我通过使用 ANTLRv3 和 java 语法代码生成了一个 Java 解析器和词法分析器......

但我不知道如何使用生成的解析器和词法分析器生成上下文流图。

我试图通过教程页面学习如何做到这一点,但教程页面已经消失了。

你能给我一个如何做到这一点的方法吗?或教程页面?

谢谢你。

java parsing antlr control-flow-graph

2
推荐指数
1
解决办法
6788
查看次数

是否可以使用 if 和 while 将所有控制流图转换回?

我想知道从单个方法(不允许递归)的典型JVM 字节码(参见如何)获得的所有控制流图是否都可以转换回等效的s 和s 代码。ifwhile

如果不是,则无法转换回ifs 和whiles的最小 JVM 字节码序列是多少?

jvm if-statement bytecode while-loop control-flow-graph

2
推荐指数
1
解决办法
380
查看次数

如何从Assembly生成控制流图?

对于上下文,我试图将AVM2(ActionScript虚拟机2)字节码/汇编中的反编译器编写为高级ActionScript 3代码.据我所知,这需要我分析程序集并从中生成结果控制流图,以便推导出诸如循环和条件分支(if/else)之类的结构.

鉴于一些组装如下:

0         getlocal0         
1         pushscope         
2         findpropstrict    {, private, }::trace
4         pushstring        "one"
6         callproperty      {, private, }::trace (1)
9         pop               
10        pushbyte          5
12        pushbyte          3
14        ifngt             L1

18        findpropstrict    {, private, }::trace
20        pushstring        "two"
22        callproperty      {, private, }::trace (1)
25        pop               

L1: 
26        findpropstrict    {, private, }::trace
28        pushstring        "three"
30        callproperty      {, private, }::trace (1)
33        coerce_a          
34        setlocal1         
35        getlocal1         
36        returnvalue       
37        kill              1
Run Code Online (Sandbox Code Playgroud)

什么是生成控制流图的算法?

assembly computer-science decompiling control-flow control-flow-graph

1
推荐指数
1
解决办法
1382
查看次数

如何从JSON对象(AST)构建控制流图(CFG)

我想从以JSON格式给出的AST构建控制流图(CFG).所以这个AST是在TouchDevelop中针对每个脚本自动创建的.而且由于TouchDevelop不是面向对象的编程,我还可以使用访问者模式吗?任何有用的指针将不胜感激.

Update1:我的问题是我不明白从哪里开始.从互联网上,我应该使用访问者模式来浏览AST以访问每个节点并收集信息.从那里,我可以构建一个CFG,然后进行数据流分析.但有两个问题:

1)据我所知,我需要面向对象的编程模型,使用访问者模式,(我可能是错的),这TouchDevelop不是.

2)如下所示,AST不是AST格式,正如我在互联网上找到的那样.它是JSON格式.我想我可以解析JSON将其转换为所需的AST结构,但我不太确定.

示例脚本的源代码

meta version "v2.2,nothing";
meta name "DivideByZero";
//
meta platform "current";

action main() {
  (5 / 0)?post_to_wall;
}
Run Code Online (Sandbox Code Playgroud)

产生的AST(JSON格式)如下:

{
    "type":"app",
    "version":"v2.2,nothing",
    "name":"DivideByZero",
    "icon":null,
    "color":null,
    "comment":"",
    "things":[
        {
            "type":"action",
            "name":"main",
            "isEvent":false,
            "outParameters":[
            ],
            "inParameters":[
            ],
            "body":[
                {
                    "type":"exprStmt",
                    "tokens":[
                        {
                            "type":"operator",
                            "data":"("
                        },
                        {
                            "type":"operator",
                            "data":"5"
                        },
                        {
                            "type":"operator",
                            "data":"/"
                        },
                        {
                            "type":"operator",
                            "data":"0"
                        },
                        {
                            "type":"operator",
                            "data":")"
                        },
                        {
                            "type":"propertyRef",
                            "data":"post to wall"
                        }
                    ]
                }
            ],
            "isPrivate":false
        }
    ]

}
Run Code Online (Sandbox Code Playgroud)

procedural-programming static-analysis abstract-syntax-tree touchdevelop control-flow-graph

0
推荐指数
1
解决办法
1684
查看次数

澄清 Vulkan SPIR-V 中持续目标的确切构成

我正在尝试了解 SPIR-V 规范,例如了解 for 循环。在 1.6 修订版 2 规范的开头,有以下示例(为了一致性,仅取部分内容)

for (int i = 0; i < 4; ++i)
    color *= multiplier;
Run Code Online (Sandbox Code Playgroud)

变成:

%49 = OpLabel
      OpLoopMerge %51 %52 None ; structured loop
      OpBranch %53
%53 = OpLabel
%54 = OpLoad %16 %48
%56 = OpSLessThan %25 %54 %55 ; i < 4 ?
      OpBranchConditional %56 %50 %51 ; body or break
%50 = OpLabel ; body
%58 = OpLoad %7 %57
%59 = OpLoad %7 %31
%60 = OpFMul %7 …
Run Code Online (Sandbox Code Playgroud)

control-flow control-flow-graph vulkan spir-v

0
推荐指数
1
解决办法
92
查看次数

到底如何为编译器构建“基本块”(以JavaScript为例)?

我正在开发一个编译器项目,想知道控制流图(CFG )的“基本块”的含义和实现。他们说基本块是用于没有任何分支的线性步骤序列。但首先,有几个问题:

  1. 如果存在嵌套分支怎么办?它是如何工作的?
  2. 条件分支语句内部的逻辑怎么样,是前一个块的一部分还是当前块(或第三个块)的一部分?

例如,假设我有这个:

let a = 10;
let b = 0;
if ((foo() && bar()) || baz()) {
  b = 20;
  if (hello > world) {
    b *= 3
  }
} else {
  b = 2 * a;
}
let c = a * b
log(a);
Run Code Online (Sandbox Code Playgroud)

这里,什么是“基本块”?

const blocks = [
  {
    inputs: [],
    statements: [
      'let a = 10',
      'let b = 0',
    ],
    outputs: ['a', 'b']
  },
  {
    // ...?
  }
]
Run Code Online (Sandbox Code Playgroud)

我不是问如何准确地实现数据流分析器,只是粗略地说在这样的示例中块应该是什么?一些伪代码会有所帮助。条件表达式 …

compiler-construction control-flow-graph

0
推荐指数
1
解决办法
381
查看次数