论文部分内容阅读
函数调用关系反映了软件系统中函数间的依赖关系,在程序的理解与分析、软件的测试与维护、编译优化、过程间数据流分析等众多软件工程领域中都有着广泛的应用。完整的函数调用关系可以更好地辅助程序验证和死锁分析,提升验证和分析结果的完备性。现有的静态分析方法多数在程序编译过程中获得函数调用关系,但得到的结果只能对程序实际执行时的函数调用作出近似表达,无法得到程序中需要在运行时动态确定的函数调用,影响了其分析结果的准确性,例如通过函数指针实现的函数调用,以及面向对象语言中的虚函数调用等。针对上述问题,本文提出了一种基于控制流图(Control Flow Graph, CFG)的函数调用关系静态分析方法CR-CFG(Call Relations-CFG)。与已有静态分析方法相比,CR-CFG能够较为准确地分析函数指针和虚函数调用。本文的主要工作如下:(1)代码信息的静态提取。利用本文实现的GCC插件静态获取源文件中的类型定义和函数CFG等信息,并将获得的信息以格式化形式存入文件中。依据可执行文件名和make命令生成的信息,静态获取可执行文件依赖的所有源文件和目标文件的名称和路径,分析源文件和目标文件对应的类型和函数信息文件以及虚函数表文件,建立完整的类型和函数信息模型,并构建函数分析路径。(2)程序的模拟仿真。本文提出一种基于流敏感和上下文敏感的仿真算法,该算法依据已建立的信息模型,模拟程序执行过程,静态分析程序中每条分析路径上的语句。在分析过程中针对C/C++程序中的特殊语法作出相应处理,如与函数指针相关变量的赋值、函数指针和虚函数调用的解析,以及模拟异常处理等。(3)绘制函数调用图。基于仿真算法的分析结果,生成完整的函数调用关系,并利用Graphviz工具绘制函数调用图。(4)通过具体程序实例验证CR-CFG的正确性和完备性,并与现有的静态分析工具进行对比。同时为了验证程序的性能,对一些C/C++开源代码进行了相关测试。实验结果表明,本文提出的静态分析方法CR-CFG可以较为准确地分析函数指针和虚函数的调用,提升了分析结果的准确性,在开源代码分析中表现出了良好的性能,具有广泛的应用前景。