程序分析中的各种程序表示被用来显示程序的内在信息,比如AST,CFG,DFG(数据流图)等等捕捉了源代码的语法和语义关系。很多漏洞不考虑复合代码语义就无法发现,比如有研究表明,仅仅使用AST可以查找不安全参数的漏洞,而将AST与CFG结合则可以查找资源泄露和释放后使用漏洞。进一步,将AST,CFG,DFG联合使用,则可以检测多种类型的漏洞。除了以上的三种经典的代码结构,Devign还考虑了源代码序列本身,因为它的flatten结构能以一种“人类可读”的方式捕获代码token之间的联系。接下来分别介绍各种类型的代码表示,以及如何将个各种子图表示为一个联合图。下图(a)是整数溢出代码示例,(b)是图表示。AST是一种源代码的树形结构表示,它是代码解析器用来理解程序的基本结构和检查语法错误的第一步表示,因此,它是生成许多其他代码表示的基础。AST的节点集包括本文使用的其余三种代码表示的所有节点,从根节点开始,代码被分解为代码块、语句、声明、表达式等等,最后分解为形成叶节点的token。如图2所示,第一行是代码级别,越往下越细致,蓝色框是叶子节点,紫色箭头表示父节点和子节点的关系。CFG描述了程序在执行过程中可能要遍历的所有路径。路径选择是由条件语句决定的,例如if, for, switch语句。节点表示语句和条件,节点之间通过有向边连接,表示控制的传递。如图2所示,绿色箭头表示的是CFG图的边。DFG跟踪了CFG中变量的使用情况。数据流是面向变量的,任何数据流都涉及对某些变量的访问或修改,DFG中的边表示对相同变量的后续访问或修改。如图2所示,橙色双箭头表示DFG图的边,并在边上标注了涉及的变量。NCS(自然代码序列)体现了源代码的自然顺序,反映了源代码序列所体现的编程逻辑。如图2所示,红色箭头表示NCS的边,连接了AST所有的叶子节点。以上,Devign将一个C函数表示成一个联合图形式(包含4个子图),所有的节点就是AST的节点集合,使用预训练的word2vec模型和构建在整个项目源代码文件上的代码语料库,分别对节点的code和type编码,将两部分编码concat作为节点的初始表征。