[论文阅读] 人工智能 + 软件工程 | Call Me Maybe:用图神经网络增强JavaScript调用图构建

发布于:2025-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

《Call Me Maybe:用图神经网络增强JavaScript调用图构建》论文解读

论文标题:Call Me Maybe: Enhancing JavaScript Call Graph Construction using Graph Neural Networks

arXiv:2506.18191
Call Me Maybe: Enhancing JavaScript Call Graph Construction using Graph Neural Networks
Masudul Hasan Masud Bhuiyan, Gianluca De Stefano, Giancarlo Pellegrino, Cristian-Alexandru Staicu
Subjects: Software Engineering (cs.SE); Artificial Intelligence (cs.AI); Machine Learning (cs.LG)

研究背景:JavaScript调用图构建的困境

想象一下,你在整理一个大型公司的组织架构图,但每个员工的职位名称会动态变化,甚至有人会用别名互相称呼——这就是JavaScript调用图构建的真实写照。

在软件分析领域,调用图就像程序的"社交网络",描绘了函数之间的调用关系,是静态分析(如漏洞检测)的基础。但JavaScript作为动态语言,其函数作为"一等公民"、动态属性访问、原型继承等特性,让传统调用图构建算法陷入"鸡兔同笼"的困境:

  • 要解析某个调用点,需要先知道函数的定义位置;但函数可能通过变量动态赋值,定义位置又依赖于调用上下文
  • 现有工具如WALA在JavaScript上的召回率仅62%,假边率高达70%,而工业工具CodeQL更因追求精度放弃完整性,导致60%调用点无法解析

在这里插入图片描述

案例痛点
formula-parser库中,lexer.showPosition()调用的showPosition属性定义在另一个文件的匿名函数中,传统分析工具因无法跨文件追踪动态属性绑定,直接"丢失"了这条调用边。这种情况在JavaScript中如同"大海捞针",迫使研究者寻找新的解决方案。

创新点:给调用图构建装上"智能导航"

1. 用图神经网络破解"非局部关系"难题

传统方法只关注调用点附近的代码,如同用望远镜看全景。而本文首次将调用图增强建模为程序图的链接预测问题,利用图神经网络(GNN)捕捉跨文件、跨函数的长距离关系。
类比:GNN就像机场的行李追踪系统,能通过航班信息、乘客路线等多维度数据,预测行李该送哪个转盘,而不是只看行李标签。

2. "语法+语义"双引擎驱动的程序表示

构建包含两类边的程序图:

  • 语法边:来自抽象语法树(AST),如函数定义与调用的语法关联
  • 语义边:连接同名标识符(如lexer变量在不同文件的引用),像"语义桥梁"打通分散的代码片段
    效果:使GNN能理解"不同文件中同名变量其实是同一对象"的语义,解决动态属性访问难题。

3. 从不完美数据中学习的"容错能力"

突破传统"完美标注数据"的限制,直接使用:

  • 静态分析工具生成的不完整边(如CodeQL的结果)
  • 动态测试执行提取的边(即使测试覆盖不全面)
    价值:就像自动驾驶汽车能从模糊的路况照片中学习,GRAPHIA能从"残缺"的调用图中推断真实关系。

研究方法和思路:GRAPHIA的工作流程

1. 程序图的"清洗与扩建"

  • 修剪AST:移除表达式语句、二进制操作等噪声节点,保留核心语法结构,使模型训练速度提升60%
  • 添加语义节点:为每个标识符(如showPosition)创建专属节点,并连接所有使用该标识符的语法节点,形成"语义网络"。

2. 调用边的"双源补给"

  • 静态边:用CodeQL等工具提取确定的调用关系,作为基础训练数据
  • 动态边:通过Babel插装单元测试,捕获运行时真实调用(如lexer.showPosition()的实际执行路径)
    策略:用静态边学习"确定知识",用动态边补充"隐藏知识",类似学生既学课本又做实验。

3. GNN模型的"智能预测"

  • 架构:使用GatedGCN,节点特征包含AST类型、标识符名称、参数数量等
  • 训练方式:针对每个调用点,模型对所有可能的目标函数排序,而非简单判断"是/否"
  • 评估指标:关注正确边的排名(如top1、top5正确率),更符合实际应用中"缩小候选范围"的需求。

主要贡献:给JavaScript分析带来的三大突破

1. 性能提升:从"大海捞针"到"精准定位"

  • 对42%的静态未解析调用点,正确函数成为top1候选
  • 72%的情况中,正确边出现在前5名推荐列表中
    意义:分析师只需检查最多5个候选,而非遍历整个代码库。

2. 场景覆盖:攻克动态语言的"硬骨头"

  • 跨文件不同名函数调用:98%的情况top1正确
  • 匿名函数调用:63%的情况前5正确
    案例:成功解析formula-parser中通过原型继承实现的showPosition调用,而传统工具完全失效。

3. 方法创新:开创GNN在程序分析的新范式

  • 首次证明GNN链接预测可整体应用于多文件程序表示
  • 消融研究验证:移除语义结构致性能降61%,缺失节点特征致降13%,证明"语法+语义"表示的必要性。

解决的主要问题

  • 精度与完整性的矛盾:通过GNN预测补充传统工具缺失的调用边,提升召回率
  • 动态语言特性的挑战:利用语义边建模标识符关联,解决高阶函数、动态属性访问等场景的解析难题
  • 训练数据不足的限制:直接使用静态分析工具和动态测试的不完整数据,降低标注成本。

主要成果

GRAPHIA通过"语法+语义"的程序图表示和GNN链接预测,在50个流行npm库的实验中,将JavaScript调用图构建的未解析调用点候选列表缩小至前5,为后续分析提供了高效的起点。其方法开创了GNN在整体程序分析中的应用先例,尤其适合动态语言的复杂场景。


思维导图

在这里插入图片描述

详细总结

一、研究背景与目标
  1. 静态分析与调用图的重要性:静态分析在识别软件漏洞等方面至关重要,而构建准确的调用图是过程间分析的基础。理想调用图需具备健全性(解析所有调用)和完整性(无假边),但受Rice定理限制,现有工具如WALA在JavaScript上的召回率仅62%,假边率达70%。
  2. JavaScript的挑战:作为一等公民的函数、动态属性访问等特性导致调用图构建成“鸡兔同笼”问题,现有方法难以兼顾精度与性能。
  3. 现有机器学习方法的不足:现有工作多关注减少假阳性(如cGPruner、AutoPruner),但未解决假阴性(未解析调用点)问题,工业框架如CodeQL约60%调用点未解决。
二、GRAPHIA方法核心
  1. 整体思路:将调用图增强建模为图链接预测,利用GNN捕捉程序元素间非局部关系,首次在整体多文件程序表示上应用GNN-based链接预测。
  2. 程序图表示
    • 修剪AST:去除表达式语句、二进制表达式等非关键节点,减少树大小,提升训练速度60%。
    • 语义节点与边:为标识符引入语义节点,连接其所有使用点,增强图连通性,助力捕捉长距离关系。
  3. 训练数据
    • 静态边:来自CodeQL等静态分析工具,虽不完整但准确。
    • 动态边:通过Babel instrumentation从单元测试执行中提取,补充静态分析缺失的边。
  4. 模型与评估
    • GNN架构:使用GatedGCN,节点特征包括AST节点类型、名称、参数/参数数量。
    • 评估指标:基于调用点目标函数排名,而非传统ROC曲线,因调用图数据稀疏。
三、实验结果与分析
  1. 数据集
    • 50个流行npm库,约400万节点,600万结构边,38.6万语义边,163K调用边(150K静态,13K动态)。
  2. 核心性能
    • 42%静态未解决调用点中,正确目标函数为top1候选。
    • 72%的情况正确边在前5名排名中。
  3. 消融研究
    • 移除代码表示(仅保留函数和调用表达式节点)致性能降61%(如formula-parser库)。
    • 缺失节点特征致性能降13%(如formula-parser库)。
  4. 动态边影响
    • 整合动态边后,formula-parser库rank0预测提升106%,js-yaml提升50%。
    • 跨项目迁移学习中,mathjs、express等库rank0提升超60%。
  5. 复杂场景处理
    • 不同文件不同名称函数调用,98%情况top1正确。
    • 匿名函数调用,63%情况前5正确。
四、关键结论
  1. GRAPHIA通过GNN链接预测有效提升JavaScript调用图召回率,为动态属性访问、高阶函数等复杂场景提供解决方案。
  2. 程序图的语法-语义表示与节点特征是模型性能的关键,缺失会显著降低效果。
  3. 动态分析可补充静态数据,提升模型泛化能力,尤其在跨项目场景中潜力大。
五、数据集与工具
类别 详情
数据集规模 50个npm库,163K调用边(150K静态,13K动态),660万结构边,38.6万语义边
主要工具 CodeQL(静态分析)、Babel(动态分析)、DGL+PyTorch(GNN实现)
评估指标 调用点目标函数排名(top1、top5正确率)

关键问题

1. GRAPHIA如何解决JavaScript调用图构建中的主要挑战?

答案:GRAPHIA将调用图增强问题建模为图链接预测,通过结合语法和语义边的程序图表示,利用图神经网络(GNN)捕捉程序元素间的非局部关系,如高阶函数、动态属性访问等复杂场景。其创新点在于引入语义节点连接同名标识符,增强图连通性,同时从静态分析工具生成的不完整边和动态测试提取的边中学习,提升对未解析调用点的预测能力。实验显示,42%的静态未解决调用点中正确目标函数为top1候选,72%在前5名中正确预测。

2. 实验中GRAPHIA的关键性能指标是什么?如何验证其有效性?

答案:核心指标是调用点目标函数的排名表现:在50个流行JavaScript库的163K调用边上,42%的静态未解决调用点中GRAPHIA将正确函数列为top1,72%在前5名中正确预测。通过消融研究验证组件重要性:移除代码表示(语法-语义结构)致性能降61%,缺失节点特征致降13%。动态边整合实验显示,部分库rank0预测提升超100%,跨项目迁移学习也证明其泛化能力。

3. 动态分析如何影响GRAPHIA的性能?有哪些实际应用价值?

答案:动态分析通过单元测试执行提取调用边,补充静态分析的不完整数据。整合动态边后,GRAPHIA在formula-parser库中rank0预测提升106%,js-yaml提升50%,且在跨项目场景中(如用4个项目数据训练、1个测试),mathjs、express等库rank0提升超60%。实际价值在于:1)缓解静态分析的假阴性问题;2)支持对复杂代码模式(如匿名函数、跨文件调用)的解析;3)为工业静态分析框架(如CodeQL)提供补充,将未解决调用点的候选列表缩小至前5,便于人工审核。

总结

本文提出了GRAPHIA方法,旨在利用图神经网络(GNN)增强JavaScript调用图的构建,通过将调用图增强问题建模为程序图的链接预测,并结合基于语法和语义的边来丰富图表示,从而捕捉程序元素间的非局部关系。实验在50个流行JavaScript库和163K调用边上进行,结果显示,对于超过42%的静态未解决调用点,GRAPHIA将正确目标函数列为首要候选,72%的情况在前5名中正确预测,证明了基于学习的方法可有效提升调用图构建的召回率,且首次展示了GNN-based链接预测可整体应用于多文件程序表示以辅助过程间代码分析任务。


网站公告

今日签到

点亮在社区的每一天
去签到