CN106970819B - 一种基于prdl规则描述语言的c程序代码规范检查装置 - Google Patents

一种基于prdl规则描述语言的c程序代码规范检查装置 Download PDF

Info

Publication number
CN106970819B
CN106970819B CN201710191241.2A CN201710191241A CN106970819B CN 106970819 B CN106970819 B CN 106970819B CN 201710191241 A CN201710191241 A CN 201710191241A CN 106970819 B CN106970819 B CN 106970819B
Authority
CN
China
Prior art keywords
query
rule
queries
code
program
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.)
Expired - Fee Related
Application number
CN201710191241.2A
Other languages
English (en)
Other versions
CN106970819A (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
Original Assignee
Tsinghua University
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 filed Critical Tsinghua University
Priority to CN201710191241.2A priority Critical patent/CN106970819B/zh
Publication of CN106970819A publication Critical patent/CN106970819A/zh
Application granted granted Critical
Publication of CN106970819B publication Critical patent/CN106970819B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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

Abstract

本发明提供一种基于PRDL规则描述语言的C语言代码规范检查装置及其检查方法,代码规范检查装置包括五个功能模块:规则解析器,程序解析器,规则检查引擎,缺陷报告器,用户交互接口。其中,规则解析器由语义解析器和查询优化器两个子功能模块组成,负责解析PRDL规则语义生成初始逻辑查询计划,再对该计划进行重写优化。程序解析器由代码行解析器、标记流解析器、语法树解析器三个子功能模块所组成,负责对源代码进行文本特征抽取和结构特征抽取,将抽取得到的三个层次(代码行、标记、语法树)的模型融合成C程序模型。本发明对用户选择或定义的PRDL规则进行语义解析,从而获取违背规则的缺陷代码相关信息,将检查结果报告给用户进行审核与评估。

Description

一种基于PRDL规则描述语言的C程序代码规范检查装置
技术领域
本发明涉及到检查C语言程序代码规范的技术,特别涉及到基于PRDL语言的结构化查询以及C程序的多模型融合表征,属于基于规则的静态分析技术。
背景技术
静态分析是保证软件质量的重要手段。通过扫描分析应用程序的源代码,可以在软件开发的早期阶段就发现一些潜在的缺陷。代码规范检查装置属于基于规则的静态分析工具。这类工具通过将源代码或是源代码经过分析得到的产物与描述缺陷的规则进行词法或语法上的匹配,发现违反规则的情形。常见的工具有CheckStyle,PMD,C++test等,下面对这些软件进行简介:
CheckStyle:一款帮助开发者写出遵循某些规范Java代码的静态检测工具。Checkstyle内嵌了对Sun Code Conventions和GoogleJavaStyle这两种代码规范的支持,用户可以通过自定义配置来实现对其他代码规范的支持。然而,自定义Checkstyle的检查规则并不是一件简单的事,用户需要做的不是描述一条规则,而是用代码实现对这条规则的检查,包括检查器、过滤器、监测器这三个组件。检查器是用来实现规则检查这一主要功能的,用户需要做遍历语法树等比较底层的事情,然后还要细化一系列检查器属性,把检查器作为插件整合进Checkstyle主体程序中。过滤器的功能是决定哪些事件可以通过检查器被报告给监测器,用户一般需要实现其中的accept(AuditEvent)方法。监测器监听检查器在检查代码过程中的行为,包括开始检查一个文件,发现了违反规则的情况等,然后做出适当的响应,比如输出错误信息等。当然过滤器和监听器要也与Checkstyle主体程序进行相应整合,只有完成所有这些步骤,才算是成功添加了一条规则。
PMD:面向Java语言的静态检测工具,可以检查出一些潜在的缺陷,比如死代码,未经优化的代码,过于复杂的表达式,重复代码等。PMD支持两种自定义规则的形式,一种是调用API写Java代码,过程和Checkstyle类似;另一种是使用XPath查询语言写规则,当XPath查询找到了匹配结果,就将它作为违反规则的情形加入报告中。之所以能这么做,是因为Java源代码可以被解析成抽象语法树(AST)这一树形结构。AST可以被视作结构化文档,正如XML一样,因而可以通过XPath查询以寻找特定模式。在PMD中使用XPath写查询可以分为以下几步:1.在工具中写出想要查找的Java代码;2.掌握代码对应的抽象语法树结构;3.写出匹配查询模式的XPath表达式;4.不断修改代码并返回第2、3步完善XPath表达式。举例来说,如果用户希望找到局部变量,可以使用表达式“//LocalVariableDeclaration”,可以看出以这种方式定义规则比较简洁清晰。
C++test:一款商业化软件测试工具。C++test能够做包括代码规范检查在内的代码静态检测,还具有数据流分析和单元测试生成等许多功能。除了使用C++test规则库中的GJB 5369-2005,JSF,MISRA-C等代码规范,用户还可以通过C++test提供的规则编辑工具RuleWizard在图形化界面中自定义规则。用户使用RuleWizard的各种组件将规则描述为一种代码模式,该模式如果出现在代码中就将被规范检查引擎检测到并报告。由于集合、触发器等概念的存在,使得C++test尽管采用了图形化的规则描述方式,但是规则的语义依然不清晰。使用RuleWizard来编写规则学习门槛高,且在编辑完成新的规则后很难判断规则描述是否与需求相符。
以上介绍的三种工具各有优劣。Checkstyle有成型规则库,但是在扩展时需要用户自己写代码调用API实现规则检查,工作量比较大;PMD工具除了可以用写代码的形式定义规则外,还支持使用Xpath语言定义基于抽象语法树遍历的规则,但没有标准化的规则库。此外,转化成XML文档之后的源代码将多占用10倍的存储空间;C++test支持C/C++语言,自带的规则库比较全面,但使用图形界面RuleWizard定义的规则理解起来不方便,而且只能独立使用,没有整合入开发环境中,易用性有待提升。
发明内容
有鉴于此,本发明提供了一种基于PRDL规则描述语言的C程序代码规范检查装置及其检查方法。在查询语言方面,该检查装置支持以结构化查询语言PRDL自定义规则,能有效解析PRDL规则的语义并做合理优化。在查询对象方面,该检查装置根据输入的C程序,分析程序的文本特征与结构特征,从而获得程序的多特征融合表征模型。在程序模型上通过路径查找操作和谓词过滤操作执行规则检查之后,它可以将违反规则的缺陷代码报告给用户进行评估审核。
一种基于PRDL规则描述语言的C程序代码规范检查装置,其特征在于:所述代码规范检查装置包括五个功能模块:
规则解析器,由下述两个子功能模块组成:语义解析器、查询优化器,首先语义解析器解析PRDL规则语义,生成初始逻辑查询计划,查询优化器再对该计划进行重写优化,生成优化逻辑查询计划,并将其送入规则检查引擎;
程序解析器,由代码行解析器、标记(Token)流解析器、语法树解析器三个子功能模块所组成,负责对源代码进行文本特征抽取和结构特征抽取,将抽取得到的代码行、标记、语法树三个层次的模型融合成C程序模型送入规则检查引擎;
规则检查引擎,负责接收规则解析器送入的优化逻辑查询计划和程序解析器送入的C程序模型,按照优化逻辑查询计划执行规则检查,将检查结果发送给缺陷报告器;
缺陷报告器,负责根据规则检查引擎的检查结果以及相应规则的信息,将可能的代码缺陷整合并汇报给用户交互接口;
用户交互接口,由分别完成各自功能的四个子功能模块:规则库管理、测试集管理、规则检查界面及结果显示模块所组成,负责根据用户需求定制检查的上下文,并将缺陷报告器整合完毕的结果向用户进行反馈。
进一步地,所述规则解析器中两个子模块的功能是:
语义解析器对PRDL规则文本进行解析,产生查询上下文和初始逻辑查询计划,并向查询优化器提供接口,以便查询优化器读取这些信息;
查询优化器对初始逻辑查询计划应用重写优化策略,产生优化逻辑查询计划,并向规则检查引擎提供接口,供其读取信息。
进一步,所述程序解析器中三个子模块的功能是:
代码行解析器以源代码作为输入,为每一行代码生成一个数据封装对象,提供程序行层次的文本信息;
标记流解析器以源代码作为输入,对代码中的每个标记进行封装与连接,提供单词层次的文本信息;
语法树解析器,提供程序的结构信息,包括程序的语法组成元素以及它们之间的关系;
三个子模块之间互相提供接口,以实现对象间相互转化,三个子模块都向规则检查引擎提供接口,供其读取程序行、单词层次的文本信息以及结构信息。
进一步,所述PRDL规则描述语言的基本结构包括内部变量定义、内部函数定义、外部函数定义、规则主体;规则有两个来源,一是内嵌的规则库,现包括GJB 5369-2005航天型号软件C语言安全子集中的138条规则和MSIRA-C汽车制造业嵌入式C编码标准中的117条规则;二是用户自定义规则,允许用户添加按照PRDL规则描述语言语法写成的规则。
本发明还提供一种基于PRDL规则描述语言的C语言代码规范检查方法,其特征在于:包括以下操作步骤:
(1)将用户选择的源代码文件和规则集输入代码规范检查装置;
(2)根据用户指定的规则集,读取相应的PRDL规则,对每一条规则进行语义解析,生成相应的初始逻辑查询计划,依据重写优化策略对初始逻辑查询计划进行重写,产生待执行的优化逻辑查询计划;
(3)对待检查的源代码进行解析,构造程序模型,经过词法解析产生代码行信息和标记信息,经过语法解析等处理后获得查询使用的语法树信息,通过计算代码行信息、标记信息在代码中的偏移量可以把它们与得到的查询使用的语法树节点映射起来,形成程序模型;
(4)根据查询计划,在程序模型上执行检查,使用深度优先搜索算法进行路径查找以明确结构关系,并按照约束条件在程序模型上进行过滤;
(5)规则检查结束后,对检查结果进行多种形式的展示,包括对违反规则的代码片段高亮,生成报告等,供用户审阅。
进一步,重写优化策略必须遵循的框架是:应用重写优化策略产生的优化逻辑查询计划送出的C程序模型上的查询结果与初始逻辑查询计划查询的结果完全一致,并且优化后的逻辑查询计划执行耗时更短。
进一步,重写优化策略包括以下三种:
约束位置重置策略,查询计划中存在一个查询的搜索空间包含有另一个查询的搜索空间,但两个查询独立从全局空间进行搜索的情况,对应的优化策略是重置查询的执行顺序,让两者嵌套执行,并使前者查询优先于后者查询执行,以保证后者查询在更小的搜索空间中进行搜索,更快得到查询结果;
重用子查询策略,查询计划中存在一个查询可能是多个查询的子查询,即多个查询需要使用该查询的查询结果的情况,对应的优化策略是将前者查询的查询结果提前计算并缓存,等其他查询需要用到前者查询的查询结果时,将缓存的查询结果取出使用即可,避免重复查询;
最优查询路径起点策略,查询计划本身可以转化为查询树,选择不同的查询作为查询起点,会产生不同层次的查询树,使得查询执行的时间不同,为了提高执行效率,根据统计,选择出现频率最小的节点为查询起点,对查询计划进行变形,即可提高查询效率。
进一步,所述步骤(2)的PRDL规则的结构,包括内部变量定义、内部函数定义、外部函数定义、规则主体;对PRDL规则结构中四个部分进行分别处理,具体包括:
1)从内部定义中抽取变量定义和函数定义,将内部变量表和内部函数表一起存入查询的上下文中待访问;
2)从外部定义中抽取外部函数信息,构建外部函数表,存入查询的上下文中待访问;
3)对定义和主体中的查询表达式,则经过转化和重写得到逻辑查询计划,存入查询的上下文待执行。
进一步,所述步骤(3)中,其中得到查询使用的语法树的具体步骤如下:
1)首先对源代码进行预处理,得到抽象语法树;
2)接着对抽象语法树中的节点进行递归标注,使其节点与查询使用的语法树节点对应起来,此时查询使用的语法树节点还是孤立的;
3)按照C语言语法特征以及结构查询需求,对查询使用的语法树节点进行结构改造,完成后形成最终的树形结构。
相比于目前其他相关技术,本发明主要的技术创新点有:
1、可扩展规则库:代码规则使用PRDL查询语言描述,此方法表达能力比在检查框架嵌入代码或者重写组件的方式强,易用性好,写成的语言可读性高,用户可方便地编写PRDL查询语言,提供了生成语言outline、语法检查和实时检查源代码等一系列辅助工具,帮助用户高效编写,规则库具有良好的可扩展性。;
2、多特征融合模型:源程序代码经过代码行解析、标记流解析、语法树解析,将程序的文本信息和结构信息抽取存储为多特征,通过对特征属性的计算和调用关系分析方法,产生融合多特征模型,并基于此创新的多特征融合模型进行代码分析查询检查;
3、基于查询重写的优化技术:在解析PRDL规则之后,对基本的查询计划应用约束位置重置、重用子查询、选择最优查询路径起点共三种策略进行重写,有效提升查询效率。
附图说明
图1为本发明代码规范检查装置的组成结构方框图。
图2为本发明代码规范检查装置的内部数据流图。
图3为本发明代码规范检查装置的检查方法的工作流程图。
图4为本发明代码规范检查装置检查方法中规则解析流程图。
图5为本发明代码规范检查装置检查方法中获取抽象语法树的流程图。
图6为使用本发明的实施例流程图
具体实施方式
为了使本发明的技术方案和优点更加清楚,下面结合附图对本发明做进一步的详细描述。
参见图1和图2,介绍本发明基于PRDL规则描述语言的C程序代码规范检查装置的结构组成及数据流,主要包括下述五个功能模块:
1、规则解析器,负责解析PRDL规则语义,生成初始逻辑查询计划,再对该计划进行重写优化,之后送入规则检查引擎;由下述两个子功能模块组成:语义解析器、查询优化器;下面分别介绍这两个子功能模块:
语义解析器对PRDL规则文本进行解析,产生查询上下文和初始逻辑查询计划,并向查询优化器提供接口,以便查询优化器读取这些信息;
查询优化器对初始逻辑查询计划应用重写优化策略,产生优化逻辑查询计划,并向规则检查引擎提供接口,供其读取信息。
重写优化策略必须遵循的框架是:应用重写优化策略产生的优化逻辑查询计划在程序解析器送出的C程序模型上的查询结果与初始逻辑查询计划查询的结果完全一致,并且优化后的逻辑查询计划执行耗时更短。
重写优化策略包括以下三种:
约束位置重置策略,查询计划中存在一个查询的搜索空间包含有另一个查询的搜索空间,但两个查询独立从全局空间进行搜索的情况,对应的优化策略是重置查询的执行顺序,让两者嵌套执行,并使前者查询优先于后者查询执行,以保证后者查询在更小的搜索空间中进行搜索,更快得到查询结果。
重用子查询策略,查询计划中存在一个查询可能是多个查询的子查询,即多个查询需要使用该查询的查询结果的情况,对应的优化策略是将前者查询的查询结果提前计算并缓存,等其他查询需要用到前者查询的查询结果时,将缓存的查询结果取出使用即可,避免重复查询。
最优查询路径起点策略,查询计划本身可以转化为查询树,选择不同的查询作为查询起点,会产生不同层次的查询树,使得查询执行的时间不同,为了提高执行效率,根据统计,选择出现频率最小的节点为查询起点,对查询计划进行变形,即可提高查询效率。
2、程序解析器,负责对源代码进行文本特征抽取和结构特征抽取,将抽取得到的代码行、标记、语法树三个层次的模型融合成C程序模型,再送入规则检查引擎;由下述三个子功能模块所组成:代码行解析器、标记流解析器、语法树解析器;三个子模块之间互相提供接口,以实现对象间相互转化;三个子模块都向规则检查引擎提供接口,以针对这些程序模型和数据对象进行检查;下面分别介绍这三个子功能模块:
代码行解析器以源代码作为输入,为每一行代码生成一个数据封装对象,提供程序行层次的文本信息;
标记流解析器以源代码作为输入,对代码中的每个标记进行封装与连接,提供单词层次的文本信息;
语法树解析器,提供程序的结构信息,包括程序的语法组成元素以及它们之间的关系。
模型融合的方式具体如下:
对程序的解析包括两部分,一部分是文本特征解析,通过逐行读取源代码,将每一行切分,包括空白行,得到源代码的行信息;对源代码进行词法分析,得到标记流,对标记流进行封装和属性计算,得到标记信息。另一部分是树形结构解析,抽取源代码的抽象语法树及改造成适合查询的语法树的具体步骤如下:
(1)首先对源代码进行预处理,得到抽象语法树;
(2)接着对抽象语法树中的节点进行递归标注,使其节点与查询使用的语法树节点对应起来,此时查询使用的语法树节点还是孤立的;
(3)按照C语言语法特征以及结构查询需求,对查询使用的语法树节点进行结构构造,完成后形成最终的树形结构。
通过计算源代码行信息、标记信息在代码中的偏移量可以把它们与上述步骤得到的查询使用的语法树节点映射起来,形成程序模型。此为融合过程。
3、规则检查引擎,负责按照逻辑查询计划在C程序模型上执行规则检查,并通过缺陷报告器将发现的违反规则情形发送给用户交互接口;
4、缺陷报告器,负责根据规则检查引擎的结果以及相应规则的信息,将可能的代码缺陷汇报给用户交互接口;
5、用户交互接口,由分别完成各自功能的四个子功能模块:规则库管理、测试集管理、规则检查界面及结果显示模块所组成,负责根据用户需求定制检查的上下文,并将检查结果向用户进行反馈。
本发明C程序代码规范检查装置的关键是规则解析和程序解析。规则解析对PRDL规则的内部变量定义、内部函数定义、外部函数定义、规则主体四个部分分别进行处理,主要包括把定义部分存入查询上下文,把查询表达式部分解析成逻辑查询计划,并对查询计划进行重写优化。程序解析重点在于生成方便查询的语法树模型,并将其与代码行模型、标记流模型通过属性调用联系起来。这两者完成之后,查询执行变得简单而明确,使用深度优先搜索算法完成路径查找,根据约束谓词对结果做分步过滤,从找出符合规则描述的代码。
参见图3,介绍规则检查方法的主要处理步骤:
(1)将用户选择的源代码文件和规则集输入代码规范检查装置后,该工具开始工作;
(2)根据用户指定的规则集,读取相应的PRDL规则,对每一条规则进行语义解析,生成相应的初始逻辑查询计划,依据约束位置重置策略、重用子查询策略、选取最优查询路径起点策略对查询计划进行改写,产生待执行的查询计划;该步骤可详细分为下述具体操作内容(如图4所示):
(21)从内部定义中抽取函数定义和变量定义,将内部函数表和变量表一起存入查询的上下文中待访问;
(22)从外部定义中抽取外部函数信息,构建外部函数表;
(23)对定义和主体中的查询表达式,则经过转化和重写得到查询计划,存入查询的上下文待执行。
(3)对待检查的源代码进行解析,构造程序模型,经过词法解析产生代码行流和标记流,经过语法解析后产生抽象语法树,经过偏移量计算可以把各类数据对象对应起来;该步骤中的抽象语法树生成操作可细分为下述具体操作内容(如图5所示):
(31)使用Eclipse CDT工具对源代码进行预处理,得到抽象语法树;
(32)按照程序类型树设计,对抽象语法树中的节点进行递归标注,使抽象语法树节点与查询使用的语法树节点对应起来,此时查询使用的语法树节点还是孤立的;
(33)按照C语言语法特征以及结构查询需求,对查询使用的语法树节点进行结构构造,完成后形成最终的树形结构。
(4)根据查询计划,在程序模型上执行检查,使用深度优先搜索算法进行路径查找以明确结构关系,并按照约束条件对中间结果进行过滤;
(5)规则检查结束后,对检查结果进行多方位的展示,供用户审阅。
本发明已经进行了软件开发方面的实施试验,开发者可以在开发过程中使用本发明对源代码进行代码规范检查,从中找出违反规则的代码并改进,达到在软件生命周期的早期阶段减少缺陷的目的。这样进行软件开发的流程如图6所示,使用者可以一边开发,一边进行检查,然后针对检查结果进行评估审核,对可能的缺陷进行修改。

Claims (8)

1.一种基于PRDL规则描述语言的C程序代码规范检查装置,其特征在于:所述代码规范检查装置包括五个功能模块:
规则解析器,由下述两个子功能模块组成:语义解析器、查询优化器,首先语义解析器解析PRDL规则语义,生成初始逻辑查询计划,查询优化器再对该计划进行重写优化,生成优化逻辑查询计划,并将其送入规则检查引擎;
其中:重写优化的策略包括以下三种:
约束位置重置策略,查询计划中存在一个查询的搜索空间包含有另一个查询的搜索空间,但两个查询独立从全局空间进行搜索的情况,对应的优化策略是重置查询的执行顺序,让两者嵌套执行,并使前者查询优先于后者查询执行,以保证后者查询在更小的搜索空间中进行搜索,更快得到查询结果;
重用子查询策略,查询计划中存在一个查询可能是多个查询的子查询,即多个查询需要使用该查询的查询结果的情况,对应的优化策略是将前者查询的查询结果提前计算并缓存,等其他查询需要用到前者查询的查询结果时,将缓存的查询结果取出使用即可,避免重复查询;
最优查询路径起点策略,查询计划本身可以转化为查询树,选择不同的查询作为查询起点,会产生不同层次的查询树,使得查询执行的时间不同,为了提高执行效率,根据统计,选择出现频率最小的节点为查询起点,对查询计划进行变形,即可提高查询效率;
程序解析器,由代码行解析器、标记(Token)流解析器、语法树解析器三个子功能模块所组成,负责对源代码进行文本特征抽取和结构特征抽取,将抽取得到的代码行、标记、语法树三个层次的模型融合成C程序模型送入规则检查引擎;
规则检查引擎,负责接收规则解析器送入的优化逻辑查询计划和程序解析器送入的C程序模型,按照优化逻辑查询计划执行规则检查,将检查结果发送给缺陷报告器;
缺陷报告器,负责根据规则检查引擎的检查结果以及相应规则的信息,将可能的代码缺陷整合并汇报给用户交互接口;
用户交互接口,由分别完成各自功能的四个子功能模块:规则库管理、测试集管理、规则检查界面及结果显示模块所组成,负责根据用户需求定制检查的上下文,并将缺陷报告器整合完毕的结果向用户进行反馈。
2.如权利要求1所述的基于PRDL规则描述语言的C程序代码规范检查装置,其特征在于:所述规则解析器中两个子模块的功能是:
语义解析器对PRDL规则文本进行解析,产生查询上下文和初始逻辑查询计划,并向查询优化器提供接口,以便查询优化器读取这些信息;
查询优化器对初始逻辑查询计划应用重写优化策略,产生优化逻辑查询计划,并向规则检查引擎提供接口,供其读取信息。
3.如权利要求1所述的基于PRDL规则描述语言的C程序代码规范检查装置,其特征在于:所述程序解析器中三个子模块的功能是:
代码行解析器以源代码作为输入,为每一行代码生成一个数据封装对象,提供程序行层次的文本信息;
标记流解析器以源代码作为输入,对代码中的每个标记进行封装与连接,提供单词层次的文本信息;
语法树解析器,提供程序的结构信息,包括程序的语法组成元素以及它们之间的关系;
三个子模块之间互相提供接口,以实现对象间相互转化,三个子模块都向规则检查引擎提供接口,供其读取程序行、单词层次的文本信息以及结构信息。
4.如权利要求1所述的基于PRDL规则描述语言的C程序代码规范检查装置,其特征在于:所述PRDL规则描述语言的基本结构包括内部变量定义、内部函数定义、外部函数定义、规则主体;规则有两个来源,一是内嵌的规则库,现包括GJB 5369-2005航天型号软件C语言安全子集中的138条规则和MSIRA-C汽车制造业嵌入式C编码标准中的117条规则;二是用户自定义规则,允许用户添加按照PRDL规则描述语言语法写成的规则。
5.一种基于PRDL规则描述语言的C程序代码规范检查方法,其特征在于:包括以下操作步骤:
(1)将用户选择的源代码文件和规则集输入代码规范检查装置;
(2)根据用户指定的规则集,读取相应的PRDL规则,对每一条规则进行语义解析,生成相应的初始逻辑查询计划,依据重写优化策略对初始逻辑查询计划进行重写,产生待执行的优化逻辑查询计划;其中:
重写优化的策略包括以下三种:
约束位置重置策略,查询计划中存在一个查询的搜索空间包含有另一个查询的搜索空间,但两个查询独立从全局空间进行搜索的情况,对应的优化策略是重置查询的执行顺序,让两者嵌套执行,并使前者查询优先于后者查询执行,以保证后者查询在更小的搜索空间中进行搜索,更快得到查询结果;
重用子查询策略,查询计划中存在一个查询可能是多个查询的子查询,即多个查询需要使用该查询的查询结果的情况,对应的优化策略是将前者查询的查询结果提前计算并缓存,等其他查询需要用到前者查询的查询结果时,将缓存的查询结果取出使用即可,避免重复查询;
最优查询路径起点策略,查询计划本身可以转化为查询树,选择不同的查询作为查询起点,会产生不同层次的查询树,使得查询执行的时间不同,为了提高执行效率,根据统计,选择出现频率最小的节点为查询起点,对查询计划进行变形,即可提高查询效率;(3)对待检查的源代码进行解析,构造程序模型,经过词法解析产生代码行信息和标记信息,经过语法解析处理后获得查询使用的语法树信息,通过计算代码行信息、标记信息在代码中的偏移量可以把它们与得到的查询使用的语法树节点映射起来,形成程序模型;
(4)根据查询计划,在程序模型上执行检查,使用深度优先搜索算法进行路径查找以明确结构关系,并按照约束条件在程序模型上进行过滤;
(5)规则检查结束后,对检查结果进行多种形式的展示,包括对违反规则的代码片段高亮,生成报告,供用户审阅。
6.如权利要求5所述的基于PRDL规则描述语言的C程序代码规范检查方法,其特征在于:重写优化策略必须遵循的框架是:应用重写优化策略产生的优化逻辑查询计划送出的C程序模型上的查询结果与初始逻辑查询计划查询的结果完全一致,并且优化后的逻辑查询计划执行耗时更短。
7.如权利要求5所述的基于PRDL规则描述语言的C程序代码规范检查方法,其特征在于:所述步骤(2)的PRDL规则的结构,包括内部变量定义、内部函数定义、外部函数定义、规则主体;对PRDL规则结构中四个部分进行分别处理,具体包括:
1)从内部定义中抽取变量定义和函数定义,将内部变量表和内部函数表一起存入查询的上下文中待访问;
2)从外部定义中抽取外部函数信息,构建外部函数表,存入查询的上下文中待访问;
3)对定义和主体中的查询表达式,则经过转化和重写得到逻辑查询计划,存入查询的上下文待执行。
8.如权利要求5所述的基于PRDL规则描述语言的C程序代码规范检查方法,其特征在于,所述步骤(3)中,其中得到查询使用的语法树的具体步骤如下:
1)首先对源代码进行预处理,得到抽象语法树;
2)接着对抽象语法树中的节点进行递归标注,使其节点与查询使用的语法树节点对应起来,此时查询使用的语法树节点还是孤立的;
3)按照C语言语法特征以及结构查询需求,对查询使用的语法树节点进行结构改造,完成后形成最终的树形结构。
CN201710191241.2A 2017-03-28 2017-03-28 一种基于prdl规则描述语言的c程序代码规范检查装置 Expired - Fee Related CN106970819B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710191241.2A CN106970819B (zh) 2017-03-28 2017-03-28 一种基于prdl规则描述语言的c程序代码规范检查装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710191241.2A CN106970819B (zh) 2017-03-28 2017-03-28 一种基于prdl规则描述语言的c程序代码规范检查装置

Publications (2)

Publication Number Publication Date
CN106970819A CN106970819A (zh) 2017-07-21
CN106970819B true CN106970819B (zh) 2020-07-10

Family

ID=59335974

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710191241.2A Expired - Fee Related CN106970819B (zh) 2017-03-28 2017-03-28 一种基于prdl规则描述语言的c程序代码规范检查装置

Country Status (1)

Country Link
CN (1) CN106970819B (zh)

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107621950A (zh) * 2017-08-10 2018-01-23 清远博云软件有限公司 一种嵌入式软件开发方法
CN109359028B (zh) * 2018-08-22 2024-05-03 平安科技(深圳)有限公司 代码质量监控方法、装置、计算机设备及存储介质
CN109471634B (zh) * 2018-08-28 2021-11-16 上海思立微电子科技有限公司 源代码格式的检查方法及设备
CN112840353B (zh) * 2018-11-01 2023-12-29 赫尔实验室有限公司 自动生成图像并在训练中输入图像的系统、方法和介质
CN109657247B (zh) * 2018-12-19 2023-05-23 中科曙光国际信息产业有限公司 机器学习的自定义语法实现方法及装置
CN109753525A (zh) * 2018-12-28 2019-05-14 国云科技股份有限公司 一种基于可配属性的企业查询系统及其实现方法
CN111414441B (zh) * 2019-01-04 2023-05-26 阿里巴巴集团控股有限公司 地图数据检查系统和方法、检查规则配置系统和方法
CN110489103A (zh) * 2019-08-08 2019-11-22 中腾信金融信息服务(上海)有限公司 一种风控规则编辑器交互装置及方法
CN110609693B (zh) * 2019-08-15 2023-05-26 深圳赛安特技术服务有限公司 基于数据标准化的代码更新方法、装置及终端设备
CN110727437B (zh) * 2019-09-10 2024-04-09 平安普惠企业管理有限公司 代码优化项获取方法、装置、存储介质及电子设备
CN110908677B (zh) * 2019-11-29 2023-03-28 安徽智恒信科技股份有限公司 一种Flutter应用安装包体积优化的方法及存储介质
CN111026663B (zh) * 2019-12-09 2023-06-09 支付宝知识产权控股公司 一种软件缺陷检测方法、装置、计算机设备和存储介质
CN112346730B (zh) * 2020-11-04 2021-08-27 星环信息科技(上海)股份有限公司 一种中间表示的生成方法、计算机设备及存储介质
CN112287012B (zh) * 2020-11-26 2022-05-03 杭州火树科技有限公司 采用Spark SQL模式实现http接口调用方法
CN113391815B (zh) * 2021-06-09 2023-11-21 上海创景信息科技有限公司 基于多种开发语言的源码分析结果测试方法及系统
CN116089476B (zh) * 2023-04-07 2023-07-04 北京宝兰德软件股份有限公司 数据查询方法、装置及电子设备

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100461132C (zh) * 2007-03-02 2009-02-11 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN102339252B (zh) * 2011-07-25 2014-04-23 大连理工大学 基于xml中间模型以及缺陷模式匹配的静态检测系统
CN102789450A (zh) * 2012-07-12 2012-11-21 卢玉敏 基于规则的可定义式语义解析系统及方法
CN103838711A (zh) * 2012-11-26 2014-06-04 上海柚艾信息技术有限公司 基于规则的可定义式语义解析系统及方法
CN105022958B (zh) * 2015-07-11 2018-01-12 复旦大学 一种安卓应用中基于代码库安全规约的应用程序漏洞检测分析方法
CN105718593B (zh) * 2016-01-28 2019-04-16 长春师范大学 一种数据库查询优化方法及系统

Also Published As

Publication number Publication date
CN106970819A (zh) 2017-07-21

Similar Documents

Publication Publication Date Title
CN106970819B (zh) 一种基于prdl规则描述语言的c程序代码规范检查装置
US8875110B2 (en) Code inspection executing system for performing a code inspection of ABAP source codes
Androutsopoulos et al. State-based model slicing: A survey
CN110347598B (zh) 一种测试脚本生成方法、装置、服务器及存储介质
CN103577168A (zh) 测试用例创建系统及方法
Delfmann et al. The generic model query language GMQL–Conceptual specification, implementation, and runtime evaluation
CN110673854A (zh) Sas语言编译方法、装置、设备及可读存储介质
CN106293891B (zh) 多维投资指标监督方法
CN108984155A (zh) 数据处理流程设定方法和装置
Wood et al. A model-driven development approach to mapping UML state diagrams to synthesizable VHDL
WO2011101206A1 (en) A method and a system for searching for parts of a computer program which affects a given symbol
CN110059006B (zh) 代码审计方法及装置
WO2021253641A1 (zh) 着色语言翻译方法
US20150193213A1 (en) Computer Implemented System and Method for Checking a Program Code
KR101877828B1 (ko) 인공지능 기반의 사용자 인터페이스 통합 플랫폼 시스템
Soeken et al. Automating the translation of assertions using natural language processing techniques
CN115113927A (zh) 寄存器模型处理方法、装置、计算机设备和存储介质
CN109471637B (zh) 电路图的审查脚本调试方法
CN115080448B (zh) 一种软件代码不可达路径自动检测的方法和装置
CN110580170A (zh) 软件性能风险的识别方法及装置
de Lara et al. Formal support for QVT-Relations with coloured Petri nets
CN115454702A (zh) 日志故障分析方法、装置、存储介质及电子设备
Yusuf et al. An automatic approach to measure and visualize coupling in object-oriented programs
Kusel et al. Common pitfalls of using QVT relations-graphical debugging as remedy
Karampiperis et al. ER designer toolkit: a graphical event definition authoring tool

Legal Events

Date Code Title Description
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
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20200710

CF01 Termination of patent right due to non-payment of annual fee