CN107943481A - 基于多模型的c语言程序代码规范构造方法 - Google Patents

基于多模型的c语言程序代码规范构造方法 Download PDF

Info

Publication number
CN107943481A
CN107943481A CN201710367175.XA CN201710367175A CN107943481A CN 107943481 A CN107943481 A CN 107943481A CN 201710367175 A CN201710367175 A CN 201710367175A CN 107943481 A CN107943481 A CN 107943481A
Authority
CN
China
Prior art keywords
model
code
prdl
program
node
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201710367175.XA
Other languages
English (en)
Other versions
CN107943481B (zh
Inventor
周旻
顾明
孙家广
徐宝新
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Beijing Tongtech Co Ltd
Original Assignee
Tsinghua University
Beijing Tongtech Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University, Beijing Tongtech Co Ltd filed Critical Tsinghua University
Priority to CN201710367175.XA priority Critical patent/CN107943481B/zh
Publication of CN107943481A publication Critical patent/CN107943481A/zh
Application granted granted Critical
Publication of CN107943481B publication Critical patent/CN107943481B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Computational Linguistics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明首先针对源代码进行了五种代码特征定义模型的抽象化封装,并且通过程序元素间的属性关联实现了这五种代码特征定义模型的融合,为用户提供了一种融合的多维代码查询特征定义模型。使用文本式的查询语言PRDL,在解析PRDL的语义和执行其语法动作的同时,实现了对于目标程序源代码的对应分析和检查。通过使用本发明,用户能高效快捷的对编码规范规则进行形式化定义,并对代码进行自主检查,从而达到提高代码整合质量、提高编程效率的技术效果。

Description

基于多模型的C语言程序代码规范构造方法
技术领域
本发明属于程序分析领域,特别涉及基于多模型的C语言程序代码规范描述。
背景技术
随着软件系统日益复杂,编程语言自身强大的功能为程序员提供编程自由的同时也引入了麻烦。软件系统的开发一般是团队协作完成的,不同人的编程习惯和风格各异,对规范的忽视使得代码在整合和维护时安全隐患增多。
在如今的软件开发过程中,人们越来越意识到规范化编码的重要性,特别是在对安全性要求极高的领域,如航空航天和汽车行业,针对编码规范问题制定了C编程规范集MISRA-C和航天型号软件C语言安全子集GJB-5369。
目前已有的相关工具中主要提供三种编码规范的定义方式:一是通过配置检查项描述编码规范规则的语义,二是提供特定形式化语言的定义方法,第三种是提供开发接口供用户编程实现描述。在用户体验上,配置检查项和编程实现的方式在使用上对用户要求较高,且不适用于批量描述规则的情况,不及形式化语言让人容易接受。已有的形式化语言,如C++test提供的RuleWizard,虽然具有很强的通用性,且已对多个编码规范集合进行定义,但其描述的编码规范规则逻辑结构比较复杂,不易理解,在易用性上表现不佳。除此之外,部分编码规范检查工具并不能检查与控制流和数据流相关的编码规范规则。
发明内容
本发明的目的是实现一种构造C语言程序代码规范的方法,并且在这个方法的基础上提出了构造C语言程序代码规范的一般化方法。本方法首先针对源代码进行了五种代码特征定义模型的抽象化封装,并且通过程序元素间的属性关联实现了这五种代码特征定义模型的融合,为用户提供了一种融合的多维代码查询特征定义模型。该模型允许用户从多个维度来分析和查询代码元素。随后,本方法中还定义了一种文本式的查询语言——PRDL。用户可以使用这种语言来在上述的融合特征定义模型中进行查询。融合的代码特征定义模型与领域特定语言PRDL共同构成了一种代码分析的形式化查询模型。本方法中实现的这种形式化查询模型允许用户快速的构造代码规范的形式化语义:融合的特征定义模型使得用户能自由灵活的选择分析角度,PRDL具有简洁灵活的符号化语法,两者的结合使得代码规范的构造简介高效。最后,本方法在解析PRDL的语义和执行其语法动作的同时,实现了对于目标程序源代码的对应分析和检查。通过使用本发明设计的代码规范构造方法,用户能高效快捷的对编码规范规则进行形式化定义,并对代码进行自主检查,从而达到提高代码整合质量、提高编程效率的技术效果。
本发明提出的基于定制化的领域特定语言实现将C语言程序代码规范由自然语言定义形式,构造成形式化语言描述的形式的方法,其特征在于,包括以下步骤:
1)基于程序的源代码分析,建立行模型、分词流模型、抽象语法树模型、控制流图模型、函数调用图模型,共五种基本的程序语言结构特征定义模型,不同结构特征定义模型中的基本元素间存在一定的转换关系,五种模型和其基本元素间转化方法共同构造成融合的多模型的源代码结构特征定义模型;
2)基于步骤1)所定义的源代码结构特征定义模型,定义领域特定语言PRDL,并确定该语言的语法、语义定义;所述领域特定语言PRDL是一种文本化的结构式查询语言,能将源代码结构特征定义模型中的关键元素组织成对程序源代码的语义约束,基于PRDL的语义,对程序源代码的诸多语法结构进行过滤,从而查询并且筛选出满足特定要求的代码结构或片段;
3)根据步骤2)中定义的PRDL语言特有语法、语义结构,在使用PRDL语言形式化描述代码规范过程中,实现针对PRDL的集成编辑环境,提供包含代码高亮、轮廓展示、语法补全等编辑工具支持。
4)根据步骤1)-3)实现的支撑环境,将C语言程序代码转化为形式化语言文本:①分析代码规范的精确含义,分析并形成代码规范的“正例程序样例”与“反例程序样例”;②分析涉及到的程序语法元素,并使用PRDL语言将查询过程书写成文本;③对“正例程序样例”与“正例程序样例”进行人工检查,并重复步骤②直至所有“正例程序样例”被判定为符合规则,所有“反例”被判定为违反规则。
进一步地,所述步骤1)中,对于行模型的构建与转化,通过基本的文本分析,从字符串的角度来解析程序源代码的结构,构建源代码的行模型;通过查找行结束符对源代码内容进行直接分割,将程序逐行分解;
对于分词流模型的构建与转化,采用基本的分词分析,从文本的角度解析程序源代码的结构,将空格、换行符作为分隔标识,将编程语言中预设的操作符、符号与保留关键字作为独立分词单元,从而把源代码拆解成为单个的分词,分解所得的每一个分词将构成分词流模型中的基本元素,并且被实例化,构建分词流模型中的基本对象;
对于抽象语法树模型的构建与转化,根据目标源程序使用的语言特性,从语法分析的角度,对程序源代码进行解析,建立源代码的抽象语法树,抽象语法树上的每一个结点,都构成了抽象语法树模型中的系一个基本对象;
对于控制流图模型的构建与转化,对程序源代码进行语句分析,将每一条语句作为一个结点,语句的执行顺序作为有向边,得出程序执行的路径图,即程序的控制流图,控制流图中的每一个结点都对应控制流图模型中的一个基本对象;
对于函数调用图模型的构建与转化,对程序的源代码中所有函数的定义进行分析,解析函数定义中各个函数的调用关系,将每一个函数作为一个结点,函数间的调用关系构成一个有向边,从而建立起源代码的函数调用图,其中,函数调用图的每一个节点对应函数调用模型的一个基本对象。
进一步地,所述步骤2)中实现的领域特定语言PRDL,PRDL是一种自定义的基于文本的声明式描述语言,其基本结构包括查询、过滤和计算表达式,PRDL能够使用步骤1)中的5种基础查询模型以及它们融合模型,进行查找和筛选,从而获取具有某种特定结构的代码片段。
进一步地,基于所述步骤3)中说明的领域特定语言PRDL的集成编译环境,其包括PRDL的编辑界面,保存与读取,文本解析和语义动作处理。还包括语法高亮,轮廓展示,错误提示,自动补全等编辑工具支持。
进一步地,通过抽象语法树模型的基本对象所存储的结点位置属性,获取结点在源代码中的起始行号,建立抽象语法树模型的基本对象与行模型的基本对象的映射关系,实现两者的互相转换;
通过抽象语法树的基本对象所存储的结点内容,直接调用分词方法,获取结点内容的分词列表,从而建立抽象语法树模型的基本对象与分词流模型的基本对象的映射关系,实现两者的互相转换;
通过抽象语法树模型的基本对象所存储的结点内容与上下文关系,可以建立抽象语法树结点与控制流图结点的对应关系,从而建立抽象语法树模型的基本对象与控制流图模型的基本对象的映射关系,实现两者之间的相互转换;
通过抽象语法树模型的基本对象所存储的结点类型和内容信息,判断结点是否是函数相关结点,并且根据函数名的匹配关系,建立起部分抽象语法树结点与函数调用图结点的对应关系,建立抽象语法树模型的基本对象与函数调用图模型的基本对象的映射关系,实现两者之间的相互转换;
通过行模型中存储的本行的文本内容,对其进行进一步的分词处理,可以得到这个行模型中的每一个分词流模型的基本元素,从而建立起分词流模型的基本对象与行模型中基本对象的映射关系,实现两者之间的相互转换。
本发明的有益效果:本发明的方法是通过实现了一种基于多模型的C语言程序代码规范构造方法,并且基于方法提出了C语言程序代码规范构造的一般化方法。一方面对程序代码提供了多维多模型抽象,覆盖了各种程序元素,从而为用户提供多角度分析和查询代码的可能;另一方面,形式化查询语言PRDL基于该多维查询模型完成设计,使用简洁的符号化语法通过查询表达式完成编码规范规则的定义。本发明方法设计简单,易于实现。
附图说明
图1为本发明的基于多模型的C语言程序代码规范描述的示意图。
图2查询模型间的转化关系。
图3程序代码及其对应的抽象语法树结构。
具体实施方式
本发明的基于多模型的C语言程序代码规范构造方法,将结合附图和实施例详细说明。
本发明所描述的基于多模型的程序代码规范构造方法,实施过程中:首先需要实现多种特征定义模型以及转换关系;然后通过领域特定语言技术,使用文本化的方法对特征定义模型进行形式化描述;最后通过语言实现技术,构造集成编辑环境。
融合的代码结构特征定义模型
如图1所示,对C程序源代码,构建5种源代码结构特征定义模型,分别为行模型、分词流模型、抽象语法树模型、控制流图模型、函数调用图模型,模型之间的转换关系如图2所示。基于这些模型中基本元素的特征以及和其他模型间基本元素的关联,实现了其基本元素的相互转化,构建了融合的代码特征定义模型。
(a)行模型的构建与转化。
采用基本的文法分析,以换行符作为分隔字符,将程序代码切割成一行行的文本。每一行文本就对应着源代码的一个行模型基本对象。基本对象中将存储本行文本内容,所处行号等基本信息。
(b)分词流模型的构建与转化。
采用基本的分词分析,将空格、换行符作为分隔标识符,并将编程语言文法中定义的操作符、符号与保留关键字作为独立分词单元,从而把源代码拆解成为单个的 token。如此分解所得的每一个token将对应分词流模型中的一个基本对象。基本对象中将存储对应的文本内容,所处行号、本行序号等基本信息。
以如下的一段代码为例,其中的’if’,‘(‘,‘i’,’‘<’,‘10’,‘)’,‘return’,‘0’都会被分解成为独立的token,分别对应着分词流模型的一个基本对象。
(c)抽象语法树模型的构建与转化。
根据目标源程序使用的语言特性,从语法分析的角度,对程序源代码进行解析,从而建立源代码的抽象语法树。所得到的抽象语法树上的每一个结点,都对应着抽象语法树模型中的一个基本对象。抽象语法树模型的基本对象位于树中,将存储对应结点的结点类型、结点文本、父亲孩子兄弟结点、结点文本的起始行号等基本信息。
图3就给出了一段程序代码及其对应的抽象语法树结构。抽象语法树中每一个结点都对应一个抽象语法树模型的基本对象。
(d)控制流图模型的构建与转化。
对程序源代码进行控制流的分析,将每一条语句作为一个结点,语句的执行顺序作为有向边,得出程序执行的路径图,即程序的控制流图。控制流图中的每一个结点都对应控制流图模型中的一个基本对象。控制流图模型的基本对象位于一个有向图中,其存储了结点对应的文本信息、图中的前驱后继结点等基本信息。
(e)函数调用图模型的构建与转化。
对程序的源代码中所有函数的定义与引用进行分析,解析函数定义中,各个函数的调用关系。将每一个函数作为一个结点,函数间的调用关系构成一个有向边,从而建立起源代码的函数调用图。其中,函数调用图的每一个节点对应函数调用模型的一个基本对象。函数调用图模型的基本对象位于一个有向图中,其存储了函数结点的名称信息、前驱后继结点等基本信息。
(f)融合的代码特征定义模型
在以上实现的五种代码特征定义模型中,不同模型间的基本对象可以在一定程度上相互转换。不同模型间的转换关系如附图2所示。
对于行模型和分词流模型,对行模型进行分词可以得到行模型对象对应的分词流模型对象的列表。通过分词模型基本对象存储的行号信息,可以建立分词模型对象向行模型对象的映射。如此可以实现这两中模型的相互转换。
对于行模型和语法树模型,通过语法树模型中基本对象存储的起始行号,可以完成语法树模型向行模型的转换。通过行模型本身与其上下文的语法分析,可以建立子语法树,从而完成行模型向语法树模型的转换。
对于分词流和语法树模型,通过对于语法树模型中基本对象的二次分词分析,可以得到语法树模型的基本对象对应的分词流模型对象的列表,完成转化。通过分词流模型的文本与语法树模型中叶子结点的文本比较,可以完成分词流模型向语法树模型的转换。
对于语法树模型和控制流图模型,通过语法树模型中基本对象的文本属性及其上下文,可以与建立控制流图中部分结点的对应关系,从而完成转化。通过控制流图模型中基本对象本身的文本内容,及其前驱后继信息,可以找到其在语法树的对应位置,从而实现转化。
对于语法树模型和函数调用模型,通过语法树模型中函数定义类型结点对应的基本对象,与函数调用模型中每一个函数结点的比较,可以在两者之间形成一一对应的关系,从而完成转化。
领域特定语言PRDL
为方便使用以上特征描述模型,设计了一种自定义的领域特定语言PRDL。PRDL 作为一种基于文本的声明式查询语言,能够使用上述的融合模型对源代码中的代码片段进行查询。
所使用的领域特定语言PRDL语言,是一个自定义的基于文本的声明式查询语言。其基本语法要素如下:
语法元素:PRDL的语法元素可以分为变量和表达式两大类。其中变量包含7种: 用于查询结构的抽象语法树结点、控制流图结点、函数调用图结点、分词流模型的 token、代码行模型的行,以及字符串、数值。而表达式的说明如表1所示。
表1表达式的类型
可以发现,此处的查询结构中并没有直接的函数调用图模型的查询以及控制流图模型的查询。这是因为PRDL的查询结果是一个特定的代码片段,如果查询的返回值是函数调用图结点对象或者控制流图对象,将难以与代码文本找到直接对应。所以想要使用上述这两种较为抽象的模型时,需要从给定的三种模型入手,在条件过滤表达式中进行转换,再进行查询。下面将要展示的PRDL片段就是对控制流图模型的一个查询示例。
它首先用抽象语法树结点查询选取所有的函数定义结点,然后在条件过滤中找到他们对应的控制流图结点,随后挑选出控制流图结点的后继结点数大于1的结点,并返回满足这些要求的函数定义结点:
语法定义:PRDL的语法分为两部分全局定义和规则描述。全局定义包括内部定义和外部定义。全局定义允许自定义的描述规则定义中可能用到的变量和函数,外部定义还允许引用Java和Python函数脚本。规则描述可能包括查询表达式和条件过滤表达式。查询表达式确定了需要查询的模型对象,条件过滤表达式定义了该对象需要满足的某种性质。
基于上述生成的融合模型,使用领域特定语言PRDL来完成对于自然语言描述的编码规范的定义。通过对程序代码规范的自然语义的理解,确定涉及到的各种特征定义模型,以及各个特征定义模型中各个结点的约束条件。使用PRDL语言的查询表达式查询这些结点,使用条件过滤表达式来描述这些约束条件,从而完成对程序编码规范的形式化语言定义。
PRDL语言集成编辑工具
本方法中提供了领域特定语言PRDL的编辑和编译环境,通过编译已完成的自然语言描述的程序代码规范转义的PRDL文本,调用融合多模型的代码特征定义模型,本方法将对目标程序的代码进行查询和分析,以检测目标程序的代码是否符合编写的程序代码规范。
为了辅助PRDL文本的编写和编译,本方法提供了诸多编辑辅助方法支持,以上述条件过滤表达式的案例为例,下面将对提供的各种功能进行描述:
1)Outline轮廓提示
本功能将对用户编写或预先加载的PRDL文本进行实时分析,解析PRDL的文法结构,按照语法树的结构,从便于理解和分析的角度,以树状的形式展示PRDL 文本。
上述案例所对应的outline展示如下图所示:
根据这个树状结构,能清晰的指出,使用的查询方式为语法树结点查询,查询的关键名为Node,定义其别名为a。它所需要满足的条件过滤表达式与a相关,要求a是一个Loop结构。
2)语法高亮
本功能在PRDL的编辑过程和浏览过程时,同样对PRDL的文本进行了语法解析,并且对特定的语法结构和特定的关键词使用特殊的颜色进行了标记。从而有效的区分了不同语法结构和关键词,为编写PRDL文本提供了便捷,也为理解PRDL文本提供了帮助。
上述案例对应的PRDL文本,在编辑器中打开时,其语法高亮的效果如下:
3)自动补全与提示
本功能主要作用于PRDL文本的编辑过程,其对当前已输入文本进行简单的解析,从而智能的分析出当前需要输入的语法结构或是正在输入的语法结构中所缺失的部分,并且在编辑器中给出相应的提示选项,从而帮助使用者能快速而准确的编写所需要的PRDL文本。
例如以上案例在编写的过程中,可能出现以下的自动补全与提示情况:
实施例
本实施例为选择汽车工业软件可靠性联会推出的汽车软件C编程规范MISRA-C 和国军标GJB-5369编程标准子集进行形式化定义,其中MISRA-C规范集包括对C 语言的环境、字符集、标识符、类型、常量、声明与定义等共21个分类的141条编码规范规则。GJB-5369规范集包括对C语言程序的声明定义、版面书写、分支控制、指针使用等15个类别的共137条编码规范规则。在试验中,分别对每条编码规范规则使用发明的方法进行定义。
本实施例的基于多模型的程序代码规范的形式化构造方法包括以下步骤:
1)对于程序的源代码分析,建立起五种代码特征定义模型:行模型、分词流模型、抽象语法树模型、控制流图模型、函数调用图模型。并且实现这五种代码特征定义模型的融合,构筑一种融合的源代码结构特征定义模型。
2)实现自定义的领域特定语言PRDL,一种基于文本的声明式的查询语言。领域特定语言PRDL能够使用上述的代码特征定义模型,对程序源代码进行分析和检测,从而筛选出具有某种特定结构的代码片段;
3)基于融合的代码特征定义模型,使用领域特定语言PRDL,来完成自然语言描述的程序代码规范的描述。
以较为简单的规则“循环结构必须用大括号包围”为例,现对实现步骤进行详细说明:
第一部分是实现本发明所提出的基于多模型的C语言程序代码规范构造方法。如果已经预先准备好,则可以跳过本步骤;如果是需要构造大量规则,则第一部分的工作只需要进行一次。
1)构建代码分析的基本模型,并且完成这些模型之间的转化方法;
2)按照设计,实现领域特定语言PRDL;
第二部分是使用本方法来完成目标规则的构造。
1)理解规则的自然语义,并分解成各种查询模型的基本元素,确定它们各自的约束关系。本条规则禁止出现没有被大括号包围的循环体。其“正例”为所有被大括号包围的循环体,同上一实例,这个“正例”难以用PRDL直接描述。因此,这里使用其“反例”:所有不被大括号包括的循环体。
2)通过上述分析,需要查询的是不被大括号包围的循环体,并且只有这一个子构造目标。查询对象为循环结构结点,其约束条件为该结构的循环体中没有大括号包围。
3)根据对于自然语义的理解,可以设计代码规范规则的形式化定义如下:
在规则定义的构造过程中,对于PRDL的编辑有困惑的地方可以通过编译环境自带的自动补全和提示来辅助理解。本条规则的语法结构可以通过定义内容中的语法高亮以及以下的outline展示理解:
4)采用构造的形式化规则对程序代码进行检测,得到如下反馈:
如此就成功的构造出了自然语言描述规则的形式化定义。
使用本发明设计的方法,可对MISRA-C、GJB-5369等编码规范中大部分结构性规则进行形式化定义,形成PRDL语言文本,进一步可用于对代码进行静态分析。
虽然上面结合本发明的优选实施例对本发明的原理进行了详细的描述,本领域技术人员应该理解,上述实施例仅仅是对本发明的示意性实现方式的解释,并非对本发明包含范围的限定。实施例中的细节并不构成对本发明范围的限制,在不背离本发明的精神和范围的情况下,任何基于本发明技术方案的等效变换、简单替换等显而易见的改变,均落在本发明保护范围之内。

Claims (5)

1.一种基于定制化的领域特定语言实现将C语言程序代码规范由自然语言定义形式,构造成形式化语言描述的形式的方法,其特征在于其特征在于,包括以下步骤:
步骤1)、基于程序的源代码分析,建立行模型、分词流模型、抽象语法树模型、控制流图模型、函数调用图模型,共五种基本的程序语言结构特征定义模型,不同结构特征定义模型中的基本元素间存在一定的转换关系,五种模型和其基本元素间转化方法共同构造成融合的多模型的源代码结构特征定义模型;
步骤2)、基于步骤1)所定义的源代码结构特征定义模型,定义领域特定语言PRDL,并确定该语言的语法、语义定义;所述领域特定语言PRDL是一种文本化的结构式查询语言,能将源代码结构特征定义模型中的关键元素组织成对程序源代码的语义约束,基于PRDL的语义,对程序源代码的诸多语法结构进行过滤,从而查询并且筛选出满足特定要求的代码结构或片段;
步骤3)、根据步骤2)中定义的PRDL语言特有语法、语义结构,在使用PRDL语言形式化描述代码规范过程中,实现针对PRDL的集成编辑环境,提供包含代码高亮、轮廓展示、语法补全等编辑工具支持。
步骤4)、根据步骤1)-3)实现的支撑环境,将C语言程序代码转化为形式化语言文本:①分析代码规范的精确含义,分析并形成代码规范的“正例程序样例”与“反例程序样例”;②分析涉及到的程序语法元素,并使用PRDL语言将查询过程书写成文本;③对“正例程序样例”与“正例程序样例”进行人工检查,并重复步骤②直至所有“正例程序样例”被判定为符合规则,所有“反例”被判定为违反规则。
2.如权利要求1所述的方法,其特征在于,所述步骤1)中,
对于行模型的构建与转化,通过基本的文本分析,从字符串的角度来解析程序源代码的结构,构建源代码的行模型;通过查找行结束符对源代码内容进行直接分割,将程序逐行分解;
对于分词流模型的构建与转化,采用基本的分词分析,从文本的角度解析程序源代码的结构,将空格、换行符作为分隔标识,将编程语言中预设的操作符、符号与保留关键字作为独立分词单元,从而把源代码拆解成为单个的分词,分解所得的每一个分词将构成分词流模型中的基本元素,并且被实例化,构建分词流模型中的基本对象;
对于抽象语法树模型的构建与转化,根据目标源程序使用的语言特性,从语法分析的角度,对程序源代码进行解析,建立源代码的抽象语法树,抽象语法树上的每一个结点,都构成了抽象语法树模型中的系一个基本对象;
对于控制流图模型的构建与转化,对程序源代码进行语句分析,将每一条语句作为一个结点,语句的执行顺序作为有向边,得出程序执行的路径图,即程序的控制流图,控制流图中的每一个结点都对应控制流图模型中的一个基本对象;
对于函数调用图模型的构建与转化,对程序的源代码中所有函数的定义进行分析,解析函数定义中各个函数的调用关系,将每一个函数作为一个结点,函数间的调用关系构成一个有向边,从而建立起源代码的函数调用图,其中,函数调用图的每一个节点对应函数调用模型的一个基本对象。
3.如权利要求1所述的方法,其特征在于,所述步骤2)中实现的领域特定语言PRDL,PRDL是一种自定义的基于文本的声明式描述语言,其基本结构包括查询、过滤和计算表达式,PRDL能够使用步骤1)中的5种基础查询模型以及它们融合模型,进行查找和筛选,从而获取具有某种特定结构的代码片段。
4.如权利要求1所述的方法,其特征在于,基于所述步骤3)中说明的领域特定语言PRDL的集成编译环境,其包括PRDL的编辑界面,保存与读取,文本解析和语义动作处理。还包括语法高亮,轮廓展示,错误提示,自动补全等编辑工具支持。
5.如权利要求2所述的方法,其特征在于,
通过抽象语法树模型的基本对象所存储的结点位置属性,获取结点在源代码中的起始行号,建立抽象语法树模型的基本对象与行模型的基本对象的映射关系,实现两者的互相转换;
通过抽象语法树的基本对象所存储的结点内容,直接调用分词方法,获取结点内容的分词列表,从而建立抽象语法树模型的基本对象与分词流模型的基本对象的映射关系,实现两者的互相转换;
通过抽象语法树模型的基本对象所存储的结点内容与上下文关系,可以建立抽象语法树结点与控制流图结点的对应关系,从而建立抽象语法树模型的基本对象与控制流图模型的基本对象的映射关系,实现两者之间的相互转换;
通过抽象语法树模型的基本对象所存储的结点类型和内容信息,判断结点是否是函数相关结点,并且根据函数名的匹配关系,建立起部分抽象语法树结点与函数调用图结点的对应关系,建立抽象语法树模型的基本对象与函数调用图模型的基本对象的映射关系,实现两者之间的相互转换;
通过行模型中存储的本行的文本内容,对其进行进一步的分词处理,可以得到这个行模型中的每一个分词流模型的基本元素,从而建立起分词流模型的基本对象与行模型中基本对象的映射关系,实现两者之间的相互转换。
CN201710367175.XA 2017-05-23 2017-05-23 基于多模型的c语言程序代码规范构造方法 Active CN107943481B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710367175.XA CN107943481B (zh) 2017-05-23 2017-05-23 基于多模型的c语言程序代码规范构造方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710367175.XA CN107943481B (zh) 2017-05-23 2017-05-23 基于多模型的c语言程序代码规范构造方法

Publications (2)

Publication Number Publication Date
CN107943481A true CN107943481A (zh) 2018-04-20
CN107943481B CN107943481B (zh) 2021-01-26

Family

ID=61929106

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710367175.XA Active CN107943481B (zh) 2017-05-23 2017-05-23 基于多模型的c语言程序代码规范构造方法

Country Status (1)

Country Link
CN (1) CN107943481B (zh)

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109508185A (zh) * 2018-11-16 2019-03-22 中国银行股份有限公司 一种代码复查方法和装置
CN109947794A (zh) * 2019-02-21 2019-06-28 东华大学 一种交互式自然语言查询转换方法
CN110007926A (zh) * 2019-04-17 2019-07-12 广东三维家信息科技有限公司 语言转换方法及装置
CN110032363A (zh) * 2019-03-21 2019-07-19 深圳点猫科技有限公司 一种用于机器人编程的数据结构构造方法及系统
CN110489103A (zh) * 2019-08-08 2019-11-22 中腾信金融信息服务(上海)有限公司 一种风控规则编辑器交互装置及方法
CN111176629A (zh) * 2019-12-24 2020-05-19 中国建设银行股份有限公司 一种应用开发的方法和装置
CN111552465A (zh) * 2020-05-12 2020-08-18 中国民航大学 一种p2020机器码程序到c语言源程序的溯源方法
CN111651164A (zh) * 2020-04-29 2020-09-11 南京航空航天大学 代码标识符的归一化方法、装置
CN112987653A (zh) * 2019-12-17 2021-06-18 深圳市恒控科技有限公司 一种将中文程序转化为g代码的方法和装置
CN113157597A (zh) * 2020-07-08 2021-07-23 北京嘀嘀无限科技发展有限公司 结构解析方法、装置、电子设备和存储介质
CN113312880A (zh) * 2021-04-02 2021-08-27 飞诺门阵(北京)科技有限公司 文本形式转换方法、装置及电子设备
CN113553041A (zh) * 2021-09-22 2021-10-26 武汉江民网安科技有限公司 二进制程序中函数代码形式化结构生成方法、设备及介质
CN115617352A (zh) * 2022-12-02 2023-01-17 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101482847A (zh) * 2009-01-19 2009-07-15 北京邮电大学 一种基于安全漏洞缺陷模式的检测方法
CN101650651A (zh) * 2009-09-17 2010-02-17 浙江大学 一种源代码级别程序结构的可视化方法
CN101950294A (zh) * 2010-08-16 2011-01-19 无锡市浏立方科技有限公司 一种用于语义数据模型的描述性查询语言
CN102063328A (zh) * 2010-12-17 2011-05-18 北京控制工程研究所 一种用于检测中断驱动型程序数据竞争的系统
CN102789450A (zh) * 2012-07-12 2012-11-21 卢玉敏 基于规则的可定义式语义解析系统及方法
CN102819490A (zh) * 2012-07-20 2012-12-12 北京邮电大学 一种基于给定缺陷描述信息进行软件测试的方法及系统
CN103049503A (zh) * 2012-12-11 2013-04-17 南京大学 基于结构匹配的uml模型查询方法
CN104615540A (zh) * 2015-02-10 2015-05-13 上海创景计算机系统有限公司 代码规范管理系统
CN104834858A (zh) * 2015-04-24 2015-08-12 南京邮电大学 一种android应用中恶意代码的静态检测方法

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101482847A (zh) * 2009-01-19 2009-07-15 北京邮电大学 一种基于安全漏洞缺陷模式的检测方法
CN101650651A (zh) * 2009-09-17 2010-02-17 浙江大学 一种源代码级别程序结构的可视化方法
CN101950294A (zh) * 2010-08-16 2011-01-19 无锡市浏立方科技有限公司 一种用于语义数据模型的描述性查询语言
CN102063328A (zh) * 2010-12-17 2011-05-18 北京控制工程研究所 一种用于检测中断驱动型程序数据竞争的系统
CN102789450A (zh) * 2012-07-12 2012-11-21 卢玉敏 基于规则的可定义式语义解析系统及方法
CN102819490A (zh) * 2012-07-20 2012-12-12 北京邮电大学 一种基于给定缺陷描述信息进行软件测试的方法及系统
CN103049503A (zh) * 2012-12-11 2013-04-17 南京大学 基于结构匹配的uml模型查询方法
CN104615540A (zh) * 2015-02-10 2015-05-13 上海创景计算机系统有限公司 代码规范管理系统
CN104834858A (zh) * 2015-04-24 2015-08-12 南京邮电大学 一种android应用中恶意代码的静态检测方法

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109508185A (zh) * 2018-11-16 2019-03-22 中国银行股份有限公司 一种代码复查方法和装置
CN109947794A (zh) * 2019-02-21 2019-06-28 东华大学 一种交互式自然语言查询转换方法
CN109947794B (zh) * 2019-02-21 2023-09-01 东华大学 一种交互式自然语言查询转换方法
CN110032363A (zh) * 2019-03-21 2019-07-19 深圳点猫科技有限公司 一种用于机器人编程的数据结构构造方法及系统
CN110032363B (zh) * 2019-03-21 2023-07-07 深圳点猫科技有限公司 一种用于机器人编程的数据结构构造方法及系统
CN110007926A (zh) * 2019-04-17 2019-07-12 广东三维家信息科技有限公司 语言转换方法及装置
CN110489103A (zh) * 2019-08-08 2019-11-22 中腾信金融信息服务(上海)有限公司 一种风控规则编辑器交互装置及方法
CN112987653A (zh) * 2019-12-17 2021-06-18 深圳市恒控科技有限公司 一种将中文程序转化为g代码的方法和装置
CN111176629A (zh) * 2019-12-24 2020-05-19 中国建设银行股份有限公司 一种应用开发的方法和装置
CN111651164A (zh) * 2020-04-29 2020-09-11 南京航空航天大学 代码标识符的归一化方法、装置
CN111552465B (zh) * 2020-05-12 2022-07-05 中国民航大学 一种p2020机器码程序到c语言源程序的溯源方法
CN111552465A (zh) * 2020-05-12 2020-08-18 中国民航大学 一种p2020机器码程序到c语言源程序的溯源方法
CN113157597A (zh) * 2020-07-08 2021-07-23 北京嘀嘀无限科技发展有限公司 结构解析方法、装置、电子设备和存储介质
CN113312880A (zh) * 2021-04-02 2021-08-27 飞诺门阵(北京)科技有限公司 文本形式转换方法、装置及电子设备
CN113312880B (zh) * 2021-04-02 2024-01-26 飞诺门阵(北京)科技有限公司 文本形式转换方法、装置及电子设备
CN113553041A (zh) * 2021-09-22 2021-10-26 武汉江民网安科技有限公司 二进制程序中函数代码形式化结构生成方法、设备及介质
CN113553041B (zh) * 2021-09-22 2021-12-10 武汉江民网安科技有限公司 二进制程序中函数代码形式化结构生成方法、设备及介质
CN115617352A (zh) * 2022-12-02 2023-01-17 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质
CN115617352B (zh) * 2022-12-02 2023-03-28 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质

Also Published As

Publication number Publication date
CN107943481B (zh) 2021-01-26

Similar Documents

Publication Publication Date Title
CN107943481A (zh) 基于多模型的c语言程序代码规范构造方法
CN110196719B (zh) 一种基于自然语言处理的业务规则生成方法与系统
Krahn et al. Efficient editor generation for compositional DSLs in Eclipse
KR100650427B1 (ko) 자연어 인식 애플리케이션 구축을 위한 통합 개발 툴
US20120131556A1 (en) Xpath-based selection assistance of gui elements during manual test script authoring for xml-based applications
WO2007000015A1 (en) Code transformation
CN107203468A (zh) 一种基于ast的软件版本演化对比分析方法
CN106843849A (zh) 一种基于文档的库函数的代码模型的自动合成方法
Chen et al. Clone detection in Matlab Stateflow models
Nwokeji et al. Towards a comprehensive meta-model for kaos
KR100575581B1 (ko) 우선순위 그래프를 이용한 제품 계열의 기능 분석 및테스팅 경로 분석 장치 및 그 방법
Nisbet et al. Presentations of rase knowledge mark-up
Cao et al. Design and implementation for SQL parser based on ANTLR
Younis et al. Systems variability modeling: a textual model mixing class and feature concepts
CN114297443A (zh) 图数据查询语句的处理方法、装置、设备及存储介质
Falkenstine et al. Natural Language Processing for Autonomous Identification of Impactful Changes to Specification Documents
CN111176993A (zh) 一种基于抽象语法树的代码静态检测方法
Losada et al. An approach for using procedure manuals as a source for Requirements Elicitation
DI GIUDA et al. Development of a Rule-Based System for Automated BIM Code-Checking
Gaufillet et al. Avionic software development with TOPCASED SAM
de la Parra Discovery of Patterns in Simulink Systems
Silva et al. Assessing User Interface Design Artifacts: A Tool-Supported Behavior-Based Approach
Heckel et al. Advanced Modelling-Language Definition: Integrating Metamodelling with Graph Transformation
JP2722465B2 (ja) データ変換方法
CN117608656A (zh) 一种基于ast和llm的混合式前端框架迁移方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant