从PDG转换为SDG
什么是SDG?
SDG(System Dependence Graph)是一种扩展的图结构,用于表示程序或系统中的依赖关系。相较于PDG(Program Dependence Graph),SDG的层次更高,不仅涵盖单个函数或模块的依赖关系,还表示整个程序或系统的依赖结构。SDG特别适合用于大型软件的分析,因为它包括多个函数或模块之间的调用和数据依赖。
SDG的关键部分
SDG是在PDG的基础上扩展而来,主要包含以下几个关键部分:
-
PDG子图:SDG包含多个PDG子图,每个子图表示一个函数或模块的内部依赖关系。SDG的整体结构由这些PDG子图组成。
-
调用依赖边:SDG引入调用边以表示函数之间的调用关系。调用边连接调用函数的节点和被调用函数的入口节点,表示控制从调用者传递到被调用者。
-
参数依赖边:用于在调用函数和被调用函数之间传递数据。参数依赖边包含:
- 输入参数边:表示调用者将数据传递给被调用函数的参数。
- 输出参数边:表示被调用函数的返回值或输出被传回到调用者。
如何将PDG转换为SDG
将PDG转换为SDG的步骤如下:
-
构建每个函数的PDG
为程序中的每个函数或模块生成一个PDG子图,每个子图表示该函数内部的控制依赖和数据依赖关系。 -
添加调用边
在调用函数的调用指令和被调用函数的入口节点之间添加调用边,表示控制流从调用者传递到被调用者。 -
添加参数依赖边
分析函数调用关系,识别出输入和输出参数。在调用函数和被调用函数之间添加输入和输出参数依赖边,以表示数据的传递和返回。
SDG的作用
通过SDG,可以在跨函数的范围内进行程序切片,分析程序中指定变量或行为的依赖路径,找出所有可能影响或被影响的代码。这种依赖结构使得SDG非常适合用于复杂软件的分析、优化和调试。 转成后的示例图: