控制程序的流程图

blc*_*llo 5 compiler-construction computer-science compiler-theory control-flow control-flow-graph

我现在正在使用编译器类,我们正处于构建CFG以实现优化的程度.我无法弄清楚的一件事是一个程序有多少CFG?我见过的每个例子似乎都是简单代码段的CGF.所以,如果你有一个程序说三个功能.你是否为每个功能都有一个单独的CFG,或者整个程序有一个大的CFG?

Tod*_*lin 4

每个功能的 CFG 通过调用点连接。如果一个函数调用另一个函数,例如:

0  void foo() { /* do stuff */ }
1  void bar() { /* do stuff */ }
2
3  void baz() {
4     foo();  // Callsite for foo. Control transfers to foo, then foo returns here.
5     bar();  // Callsite for bar. Control transfers to bar, then bar returns here.
6  }
Run Code Online (Sandbox Code Playgroud)

那么 的控制图baz将包含一条通往 的图的边foo。同样,因为foowill 最终返回到baz(以及可能从其调用的任何其他地方),所以从 的foo图形末尾到调用fooin后的语句将有一条边baz。在这里,下一个语句是对第 5 行的调用。bar此时,有一条从bar调用点到bar的 CFG 的边,以及从barback 中的退出点到 的末尾的行baz

基本上您需要考虑的是“接下来执行什么代码”。这告诉您边缘应该在控制图中的位置。函数调用会转移控制权,直到函数返回,这意味着从调用点到函数 CFG 并再次返回的边缘。

请注意,并非所有完整程序 CFG 都是连通图。如果您正在分析的程序中有无法访问的代码,那么这将是完整 CFG 中其自身未连接的部分。例如,如果您在上面的示例中取出对的调用bar,那么bar将有自己的图形放在一边,而bazfoo将通过边连接。