摘要:
大多数作品直接处理代码或者使用语法树表示,然而因为程序的一些结构特征,像函数调用、分支、以及语句顺序的可替换性,现有的方法没有足够地理解程序语义的鲁棒性。本文提出了一种新的技术去学习代码语义,并将其应用于各种程序分析任务中。具体来说,首先规定一个适应于人类和机器生成的程序的健壮的代码分布假设,根据这个假设定义一个基于代码中间(IR,独立于源代码编程语言)表示的嵌入空间inst2vec。利用程序的数据流和控制流,我们为IR提供了一个新的上下文表示的定义,XFG。然后使用类比和聚类的方法对嵌入进行定性分析,并对三个不同的高级任务的学习表示进行评估。实验表明,即使没有微调,单个RNN架构和固定inst2vec嵌入也优于性能预测(计算设备映射、最佳线程粗化)和原始代码(104个类)的算法分类的专用方法。
现有方法的缺陷:
①??源程序设计语言固定
②顺序处理token,主要以功能的、无循环的代码为目标,这些代码并不能代表大多数应用程序。
总体结构
主要过程
源代码(不限制语言)->IR(通过LLVM编译器表示成中间表示)->XFGs(使用数据流和控制流构造,所以支持循环和函数调用)->使用XFG训练单个语句的嵌入空间(inst2vec&#x