‘壹’ 如何使用ast生成程序的控制流图(cfg)
欲解答如何使用ast生成程序的控制流图(cfg)的问题,需先明了背景。
如题中所述,提问者正在开发一个PHP漏洞分析工具,通过使用PHP-parser生成抽象语法树(AST)并进行静态污点分析(static taint analysis)。具体实现中,关键点在于定义代码模式作为“污点”的起点和终点,从起点开始进行数据流分析,追踪污点信息传播,以识别在传播至终点前是否被程序使用。
在结构化编程语言中,AST与流分析不兼容,因为这些语言具有分支、循环、跳转和异常处理等语法结构,它们隐含了不连续的控制流,而AST结构虽已简化,仍贴近语言语法。表达式内隐含的控制流也更难以追踪。故推荐在数据流分析前,将AST转换为更细粒度的中间表示(IR),其中控制流显式暴露。
实现上,提问者项目采用自定义的CFG生成器,尝试复用AST节点并构建CFG结构与记录use-def关系。此方法虽可简化实现,但未能全面覆盖预期功能。更正统的做法是先生成适配数据流分析的IR,再融合控制流生成CFG。
具体实现中,可参考V8的Hydrogen实现,直接遍历AST生成带有控制流的SSA形式IR。或借鉴GWT的jjs(JavaToJavaScriptCompiler)中的CfgBuilder,采用在AST上一层层构建控制流图的方法。
总之,AST直接用于数据流分析存在局限性,更推荐先生成兼容数据流分析的IR,再构建控制流图。这样能更高效地进行数据依赖分析,简化后续的分析工作。