如何静态查找代码库中函数的所有可静态确定传入参数?
最佳方案:基于AST解析工具静态分析翻译函数参数
AST解析工具是满足你需求的最优选择,内省和代码修改工具都不适合这个场景,原因如下:
- 内省属于运行时分析,只能捕获程序实际运行时触发的调用,覆盖不全所有代码路径,而且你要的是静态可确定的参数,完全没必要跑一遍程序,效率极低。
- 代码修改工具主打代码改写,即便能插桩获取参数,本质还是依赖运行时执行,不符合静态分析的核心需求。
AST工具的适配性与场景覆盖
AST工具能遍历代码的抽象语法树,通过常量折叠和数据流追踪,完美覆盖你列出的所有场景:
- 场景1:直接识别
translate("abc")中的字符串字面量,提取"abc" - 场景2:追踪变量
arg的赋值来源是"abc",关联到translate(arg)的参数值 - 场景3、4:识别字符串拼接表达式,将静态可确定的字面量拼接为
"abcxyz" - 场景5:分析箭头函数
getArg()的返回值是已追踪的变量arg,回溯得到最终值"abc"
对于translate(getUserInput())这类非静态场景,AST工具可以直接提取函数调用表达式的源代码文本"getUserInput()",满足你可选的需求。
具体实现思路
- 选择对应编程语言的成熟AST库:比如JS/TS用
@babel/parser+@babel/traverse,Python用内置ast模块,Java用JavaParser等。 - 编写遍历逻辑:
- 定位所有
translate函数的调用节点 - 对目标参数进行数据流分析:
- 若为字面量,直接提取值
- 若为变量,回溯赋值链路,直到找到静态可确定的最终值
- 若为无法静态解析的表达式,提取该表达式的源代码文本
- 定位所有
- 将所有提取结果整理为数组输出,直接得到你需要的参数集合,无需手动查看。
内容的提问来源于stack exchange,提问作者Xyslarda
相关产品推荐
相关产品推荐

