The invention provides an efficient program parsing method and system based on file dependency. The method includes: S1, partitioning the source file to obtain the corresponding set of preprocessing units; S2, performing the following processing on each preprocessing unit in the set of preprocessing units: if the type of preprocessing unit is confirmed as preprocessing unit The header file in the preprocessing unit is extracted if the file in the processing instruction contains instructions; if the abstract syntax tree obtained by pre-parsing the header file is confirmed, the abstract syntax tree of the header file is linked to the abstract syntax tree of the source file; if the abstract syntax tree obtained by pre-parsing the header file is confirmed to be absent The header file is used as source file execution steps S1 and S2 to parse header files. The method determines whether the header file is parsed in advance, links the parsed abstract syntax tree to the abstract syntax tree of the source file, avoids repeated parsing of the same header file, and reduces the parsing time of the program.
【技术实现步骤摘要】
一种基于文件依赖关系的高效程序解析方法和系统
本专利技术涉及程序分析
,具体涉及一种基于文件依赖关系的高效程序解析方法和系统。
技术介绍
解析是程序分析的第一步,目标是从程序源代码产生抽象语法树(AbstractSyntaxTree,AST)。一棵抽象语法树描述了程序的层次,如图1所示,为一个main函数的抽象语法树,其抽象语法树具体包括根结点(TranslationUnit)和一棵关于函数声明(MethodDeclaration)的子树组成,其中函数声明中又包含了函数返回类型(PrimitiveType)、函数名(SimpleName)以及函数体(Block),函数体包括返回语句(ReturnStatement)和数字文字(NumberLiteral)。一个解析单元对应于一个源文件,由于该示例函数比较简单,因此该例中单个函数声明组成了一个解析单元。解析的过程包括词法分析和语法分析两个部分;词法分析把源程序拆解为记号;语法分析根据词法分析的结果,把记号组合成语法单元,进而通过预处理和对预处理后语法单元的分析形成一棵抽象语法树。现有的针对程序解析的静态分析方法存在较大的效率问题。由于缺陷检测首先需要知道程序的语法结构,如果不能很快地解析出抽象语法树,整个检测速度将随之变慢。如图2所示,每个源文件都是通过一个单独的进程被解析为一棵抽象语法树(即AST);然而,每个源文件可能包括一些头文件,这些头文件在不同的源文件中都被包含,因而在整个解析过程中被重复解析。现有技术中已经存在针对头文件重复解析问题的研究,但是当前研究只在编译领域解决该问题,而在静态分析领域 ...
【技术保护点】
1.一种程序解析方法,其特征在于,包括,S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。
【技术特征摘要】
1.一种程序解析方法,其特征在于,包括,S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。2.根据权利要求1所述的方法,其特征在于,所述S1中对源文件进行分割处理的步骤前还包括:初始化源文件对应的抽象语法树,其中,初始化的抽象语法树为不含有结点的空树。3.根据权利要求1所述的方法,其特征在于,所述S2中若确认存在通过预先解析头文件获取到的抽象语法树的具体包括:根据预先存储的头文件与抽象语法树之间的映射关系,获取头文件对应的抽象语法树;若头文件对应的抽象语法树不为空,则确认存在通过预先解析头文件获取到的抽象语法树;相应地,所述S2中若确认不存在通过预先解析头文件获取到的抽象语法树的步骤具体包括:若头文件对应的抽象语法树为空,则确认不存在通过预先解析头文件获取到的抽象语法树。4.根据权利要求1所述的方法,其特征在于,所述S2中将解析后获取的头文件对应抽象语法树链接至源文件对应的抽象语法树的步骤具体包括:将头文件对应的抽象语法树上根结点的子树链接至源文件对应的抽象语法树。5.一种程序解析系统,其特征在于,包括:分割模块,用于对源文件进行分割处理,获取...
【专利技术属性】
技术研发人员:高庆,马森,张世琨,张君福,朱何龙,
申请(专利权)人:北京大学,北京北大软件工程股份有限公司,
类型:发明
国别省市:北京,11
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。