控制流图(Control Flow Graph, CFG)也叫控制流程图,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向, 也能反映一个过程的实时执行过程。
Frances E. Allen于1970年提出控制流图的概念。此后,控制流图成为了编译器优化和静态分析的重要工具。
控制流图的几种结构:
例1:
if A = 10 then
if B > C
A = B
else A = C
endif
endif
print A, B, C
其控制流图为:
例2:计算整数X和整数Y的最大公约数
int gsd(int x,int y)
{
int q=x;
int r=y;
while(q!=r)
{
if (q>r)
q=q-r;
else
r=r-q;
}
return q;
}
控制依赖讲的是:在某种情况下,一个程序指令的执行依赖于前面指令的执行(在前面某个指令执行后才会执行)。
下面从一个例子来说明控制依赖性:
S1: if x > 2 then
S2: y = 3
上面我们可以看出:只有在S1语句x > 2时,才会执行S2语句,也就是说S2的执行受S1语句的控制(影响),那么我们就称S1与S2具有控制依赖性。
数据依赖产生于两个访问或修改相同资源的语句。
同样从例子来说明数据依赖性:
1 x = 10
2 y = x + c
从上面我们可以知道:x 值的变化会引起 y 值得变化,那么我们就称 y 依赖于 x,y 与具有数据依赖性。
如下列举了几款搜索到的控制流图生成器,一些是专门用来生成控制流的,一些是作为一个模块嵌套的并可以取出来单独用到的。
pycfg
https://github.com/vrthra/pycfg
staticfg
https://github.com/coetaur0/staticfg
CFG-Generator
https://github.com/Tiankai-Jiang/CFG-Generator
pyt
https://github.com/python-security/pyt
py2cfg
https://gitlab.com/classroomcode/py2cfg
以上这些是针对Python抽象语法树来生成控制流的。
pytype
https://github.com/google/pytype
python-control-flow
https://github.com/rocky/python-control-flow
以上这些是针对Python字节码来生成控制流的。
https://blog.csdn.net/qq_42052733/article/details/115923993
https://blog.csdn.net/weixin_64871537/article/details/123415427