一种基于GCC抽象语法树的程序特征提取方法作者:张良德 赵彦博来源:《电子技术与软件工程》2013年第20期 骨刺灵uvlo电路>纸浆模具
摘推杆炉
要 提出一种基于GCC(GNU Compiler Collection)抽象语法树建立程序特征文本的方法,消除抽象语法树中与程序无关的结点,从消除冗余后的抽象语法树文本中提取可以表达程序语义的可用结点;之后对其进行信息提取,从而高效地生成程序特征文本。通过实验证明了该方法的正确性与实用性。 【关键词】抽象语法树 信息提取 程序代码 特征文本
1 引言
目前主流的程序代码抄袭检测系统JPlag[1]和YAP3[2]都采用字符串比较技术,这种技术核心问题之一是提取可以表示源程序的特征[3],即能够代表该程序内容和结构信息的字符串,该字符串是一个线性串,其包含的程序结构信息的多少,将直接影响结果的准确性。针对上述问题,本文提出了一种程序特征提取方法。该方法借助GCC(GNU Compiler Collection)编译器,将程序转换成抽象语法树(Abstract syntax tree),重点分析AST结构,从中提取表达程序语义的信息。 1.1 AST结构
GCC 编译器以源程序的过程为单位生成AST,而且包含整个编译单元的完整表示, 比较直观地表示出源程序的语法结构,并含有源程序结构显示所需的全部静态信息。AST是GCC编译器前端的中心数据结构,AST的结点类型包括以下7种:①标识符结点(identifiersappcpa),②类型结点(types),③声明结点(declarations),④函数结点(functions单顶置凸轮轴),⑤范围结点(scope),⑥语句结点(statements),⑦表达式结点(expressions)。从GCC编译器3.0版本开始,用编译参数-fdump-translation-unit[4]可以得到*.tu的以文本形式输出的AST文件,其中*为源程序名,部分AST文件如图1所示,一个结点的AST结构如图2所示,一个AST文本有若干个这样的结点组。