一种基于数据库字典的存储过程静态检测方法及系统的制作方法

文档序号:10569841阅读:262来源:国知局
一种基于数据库字典的存储过程静态检测方法及系统的制作方法
【专利摘要】本发明公开了一种基于数据库字典的存储过程静态检测方法及系统,其中,该方法包括:步骤1,建立与数据库字典服务器的连接;步骤2,查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表;步骤3,判断待检测对象列表中是否存在未检测的对象,如果存在则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树;步骤4,根据步骤3生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果;步骤5,根据静态检测结果生成静态检测报告。
【专利说明】
一种基于数据库字典的存储过程静态检测方法及系统
技术领域
[0001 ]本发明涉及静态测试领域,,属于计算机辅助静态检测技术,具体来讲,尤指一种基于数据库字典的存储过程静态检测方法及系统。
【背景技术】
[0002]静态测试是指被测试程序不在机器上运行,而采用人工检测和计算机辅助静态检测的手段对文档或程序进行检测。随着计算机技术的不断发展和软件规模的不断扩大,计算机辅助静态检测已成为程序静态测试最主要手段。计算机辅助静态检测是指通过词法分析、语法分析等技术对程序代码进行扫描,进而检测代码的语法、结构、过程、接口等来验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码检测技术。相对于人工检测,计算机辅助静态检测具有效率高、成本低、覆盖面广的优势。
[0003]近十几年间,国外已涌现出许多面向主流编程语言的静态检测工具,例如面向Java 代码的Findbugs、PMD 和Checksty Ie工具,面向 C/C++代码的K 1cwork、Po Iy Spacee工具,面向Oracle存储过程的SonarCuber工具等。国内也有相关专利发明,例如徐国爱提出的面向主流编程语言的《基于源代码静态分析的软件安全代码分析单元及其检测方法》等。这些工具和方法的共同特点是以代码文件为扫描对象,这种方式对于数据库存储过程来说,存在许多缺陷,限制了静态检测能力。以SonarCuber工具为例,由于缺少存储过程所涉及的表结构信息,所以无法检查WHERE条件中的隐式转换、无法判断SELECT INTO语句是否存在字符串长度溢出风险等,而这些检查项恰恰是数据库存储过程中非常重要的静态检测内容。究其原因,主要因为存储过程静态检测所需信息不只包含在代码文件中,还分散在其他数据库数据字典(以下简称数据库字典)中。数据库字典是数据库的重要组成部分。它存放有数据库有关的所有信息,对数据库用户来说是一组只读的表或视图。数据库字典内容包括:数据库中所有模式对象的信息(如表、视图、索引、存储过程等)、模式对象的关联信息(如存储过程所引用的模式对象)、用户及角色被授予的权限等。由此可见,通过数据库字典可以更加全面地获取存储过程信息,为此亟需设计一种基于数据库字典的新静态检测方法及系统。

【发明内容】

[0004]有鉴于此,本发明目的是提供一种基于数据库字典的存储过程静态检测方法及系统,可以克服现有存储过程的静态检测工具和方法的局限性,全面提升存储过程静态检测的能力。其中,本发明所指的存储过程泛指通过数据库过程语言编写的程序,包括程序包、存储过程和函数等。目前主流的数据库DB2、0racle、SQLSerVer、MySQL都已支持存储过程。
[0005]为达到上述目的,本发明提出了一种基于数据库字典的存储过程静态检测方法,该方法包括:步骤I,建立与数据库字典服务器的连接;步骤2,查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表;步骤3,判断待检测对象列表中是否存在未检测的对象,如果存在则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树;步骤4,根据步骤3生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果;步骤5,根据静态检测结果生成静态检测报告。
[0006]进一步的,在步骤2中,存储过程对象包括:程序包、独立存储过程、独立函数、表结构、自定义类型。
[0007]进一步的,在步骤3中,判断待检测对象列表中是否存在未检测的对象,如果有则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树,包括:步骤301,判断待检测对象列表中是否存在未检测的对象,如果有则进入步骤302,如果没有进入步骤308;步骤302,根据未检测对象的对象类型,判断未检测对象的对象信息是否在数据库字典中,如果是则跳转至步骤307,否则跳转至步骤303;步骤303,从数据库字典中获取引用对象的代码;步骤304,使用词法分析组件对引用对象的代码进行词法分析,获取记号流;步骤305,使用语法分析组件分析记号流生成语法树;步骤306,遍历语法树,将代码中的声明提取为符号,将符号添加至全局符号树中,跳转至步骤301;步骤307,从数据库字典表中直接获取对象信息,将对象信息添加至全局符号树中,跳转至步骤301;步骤308,从数据库字典中获取存储过程对象的代码;步骤309,对存储过程对象的代码进行词法分析,形成存储过程对象的记号流;步骤310,对存储过程对象的记号流进行注释分析,获得注释表;步骤311,对存储过程对象的记号流进行语法分析,生成语法树。
[0008]进一步的,在步骤4中,根据步骤3生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果,包括:步骤401,将当前节点设置为根节点;步骤402,判断当前节点是否表示新作用域,如果是新作用域则跳转至步骤403,否则跳转至步骤404;步骤403,将新的空符号表通过局部符号管理组件压入局部符号栈中;步骤404,判断当前节点是不是新符号,如果是新符号则跳转至步骤405,否则跳转至步骤406;步骤405,将符号添加至局部符号堆栈中;步骤406,调用静态检测组件,进行静态检测预处理,进行变量使用前必须赋值的检查时,标识变量符号被初始化状态;步骤407,判断是否还存在未访问的子节点,如果是,则跳转至步骤408,否则,跳转至步骤411;步骤408,将当前节点压入节点栈中;步骤409,将当前节点设为最左的未访问子节点;步骤410,将步骤408所取得子节点标识为已访问,跳转至步骤402;步骤411,访问完子节点后,再次调用静态检测组件,进行代码检查和度量,在检查和度量过程中,通过访问局部符号栈与全局符号树获取符号信息,通过访问注释表获取注释信息;步骤412,判断当前节点是否表示新作用域,如果是,则跳转至413,否则跳转至415;步骤413,从局部符号栈中弹出符号表;步骤414,判断节点栈是否为空,如果是,则表示语法树遍历结束。
[0009]进一步的,在步骤414中,如果判断节点栈不为空,跳转至步骤415;步骤415,从节点栈中取出一个节点,并赋给当前节点,跳转至步骤402。
[0010]进一步的,在步骤402中的新作用域产生于存储过程的起始位置、SQL语句的起始位置。
[0011]进一步的,在步骤404中的新符号产生于存储过程定义、变量定义、类型定义。
[0012]为达到上述目的,本发明还提出了一种基于数据库字典的存储过程静态检测系统,该系统包括:数据库访问单元,用于建立与数据库字典服务器的连接;查询单元,用于查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表;代码解析单元,用于判断待检测对象列表中是否存在未检测的对象,如果有则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树;代码检测单元,用于根据生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果;报告生成单元,用于根据静态检测结果生成静态检测报告。
[0013]进一步的,所述代码解析单元包括:词法分析组件、语法分析组件、注释管理组件和全局符号管理组件;其中,词法分析组件,用于对输入的代码字符流进行逐个扫描,从字符中识别出标识符、关键字、常量等相对独立的记号,形成记号流;语法分析组件,用于在词法分析组件输出的记号流基础上将独立的记号根据语法文法组建为抽象语法树;注释管理组件,用于利用词法分析组件输出的记号流,构造注释表,记录每一段注释的起始、结束位置和注释内容;全局符号管理组件,用于通过分析存储过程所引用的对象,利用数据库字典和代码解析,获取符号的类别、数据类型等信息。
[0014]进一步的,代码检测单元包括:局部符号管理组件和静态检测组件;其中,局部符号管理组件,用于负责管理局部符号桟,包括符号表入桟、符号表出桟、在桟顶符号表中添加符号;在抽象语法树遍历时,根据语义获取符号信息,包括符号的类别、数据类型,属于相同作用域的符号组织成局部符号表;静态检测组件,是一系列检查组件和度量组件的集合,用于完成实际静态测试任务;检查组件用于是检查存储过程是否存在缺陷或隐患,度量组件用于对存储过程的整体质量进行评估。
[0015]本发明针对数据库特点,提出了一种基于数据库字典的存储过程静态检测方法及系统,相对于目前其他相关技术,其突出优点和有益效果是:
[0016]1、只需数据库的连接信息和数据库字典表的访问权限即可完成存储过程静态检测,改变现有静态检测方法对于代码文件的依赖;
[0017]2、数据字典包含的储过程代码、表、视图、类型等信息更加准确和完整,这使得静态检测能力更加强大,可检测WHERE条件中的隐式转换、判断SELECT INTO语句是否存在字符串长度溢出风险等;
[0018]3、对数据库无限制,可支持目前所有的数据库存储过程,并具备对新的数据库存储过程的扩充能力;
[0019]4、代码与注释的分离解析,既简化了语法分析过程,又保留了代码的完整信息,有利于针对注释的静态检测组件的开发;
[0020]5、主系统已解析出存储过程所有信息,包括抽象语法树、注释库与符号表,为复杂静态检测功能提供有效支持。
【附图说明】
[0021]此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。在附图中:
[0022]图1为本发明一实施例的基于数据库字典的存储过程静态检测方法流程图。
[0023]图2为本发明一实施例的代码解析步骤流程图。
[0024]图3为本发明一实施例的代码检测步骤流程图。
[0025]图4为本发明一实施例的基于数据库字典的存储过程静态检测系统结构示意图。
[0026]图5为本发明一实施例的代码解析单元的结构示意图。
[0027]图6为本发明一实施例的代码检测单元的结构示意图。
【具体实施方式】
[0028]以下配合图示及本发明的较佳实施例,进一步阐述本发明为达成预定发明目的所采取的技术手段。
[0029]在本发明实施例中,涉及到一些术语的表述,此处先进行说明如下:
[0030]1、抽象语法树:简称为语法树,是代码的抽象语法结构的树状表现形式。树上的每个节点都表示代码中的一种结构。利用抽象语法树可以大大降低静态检测方法的复杂度。
[0031]2、符号表:是静态检测的一个重要数据结构,它记录了代码中每个标识符的类型、特征等相关信息。本发明中,符号表是一个字符串和信息的映射表,可以快速检索符号的信息。同属于某作用域的符号或者同属于某对象的符号都会组织成一个符号表。
[0032]3、注释表:一种用于保存代码注释的数据结构,建立了代码行号与注释的映射关系,可快速查询到某行的注释、某区间的数值及离某行最近的注释等。注释表的存在一方面是为提供代码的完整信息,另一方面是简化抽象语法树的构造。
[0033]4、全局符号树:将符号表以树状形式组织,即符号与符号表之间建立从属关系。通常情况下,根节点是模式符号,每个模式符号拥有子符号表,该符号表中存放着该模式下的对象符号,每个对象符号又拥有自己的子符号表。表、视图、类型、存储过程包声明等符号都存放在全局符号树中,而这些符号都来自数据库字典,而非代码本身。全局符号树的作用是实现了存储过程信息的完整性,为静态检测能力提升提供了保障。因此全局符号树是本发明的重要特征。
[0034]5、局部符号栈:将符号表以堆栈形式组织,符号表根据作用域变化动态压入堆栈或弹出堆栈。局部变量、内部存储过程都存放在局部符号表中。
[0035]结合图1所示,为本发明一实施例的基于数据库字典的存储过程静态检测方法流程图。如图1所示,该方法包括:
[0036]步骤SI,建立与数据库字典服务器的连接。
[0037]步骤S2,查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表;其中,存储过程对象包括:程序包、独立存储过程、独立函数、表结构、自定义类型。
[0038]步骤S3,判断待检测对象列表中是否存在未检测的对象;如果存在则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树。如果不存在,则执行步骤5。
[0039]步骤S4,根据步骤S3生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果。在执行完步骤S4后,可以返回继续执行步骤3,来判断是否还存在未检测的对象,如果不存在,则进一步执行步骤5。
[0040]步骤S5,根据静态检测结果生成静态检测报告。
[0041]进一步的,结合图2所示,为本发明一实施例的代码解析步骤流程图。如图2所示,在步骤S3中,代码解析包括以下步骤:
[0042]步骤S301,判断待检测对象列表中是否存在未检测的对象,如果有则进入步骤302,如果没有进入步骤S308。
[0043]步骤S302,根据未检测对象的对象类型,判断未检测对象的对象信息是否在数据库字典中,如果是则跳转至步骤S307,否则跳转至步骤S303。
[0044]步骤S303,从数据库字典中获取引用对象的代码。
[0045]步骤S304,使用词法分析组件对引用对象的代码进行词法分析,获取记号流。
[0046]步骤S305,使用语法分析组件分析记号流生成语法树。
[0047]步骤S306,遍历语法树,将代码中的声明提取为符号,将符号添加至全局符号树中,跳转至步骤S301。
[0048]步骤S307,从数据库字典表中直接获取对象信息,将对象信息添加至全局符号树中,跳转至步骤S301。
[0049]步骤S308,从数据库字典中获取存储过程对象的代码。
[0050]步骤S309,对存储过程对象的代码进行词法分析,形成存储过程对象的记号流。
[0051]步骤S310,对存储过程对象的记号流进行注释分析,获得注释表。
[0052]步骤S311,对存储过程对象的记号流进行语法分析,生成语法树。
[0053]进一步的,结合图3所示,为本发明一实施例的代码检测步骤流程图。如图3所示,在步骤S4中,代码检测包括以下步骤:
[0054]步骤S401,将当前节点设置为根节点。
[0055]步骤S402,判断当前节点是否表示新作用域,其中,新作用域产生于存储过程的起始位置、SQL语句的起始位置;如果是新作用域则跳转至步骤S403,否则跳转至步骤S404。
[0056]步骤S403,将新的空符号表通过局部符号管理组件压入局部符号栈中。
[0057]步骤S404,判断当前节点是不是新符号,新符号产生于存储过程定义、变量定义、类型定义;如果是新符号则跳转至步骤S405,否则跳转至步骤S406。
[0058]步骤S405,将符号添加至局部符号堆栈中。
[0059]步骤S406,调用静态检测组件,进行静态检测预处理,进行变量使用前必须赋值的检查时,标识变量符号被初始化状态。在执行本步骤时,尚未访问过子节点,检测组件可通过此步骤完成一些预处理,这在进行复杂检测时非常必要,比如进行“变量使用前必须赋值”的检查时,可以在本步骤就标识变量符号是否被初始化,这样在步骤S411只需简单判断表达式中的变量(即变量使用时)是否有初始化的标识,如果有即可确认变量使用时已被初始化。
[0060]步骤S407,判断是否还存在未访问的子节点,如果是,则跳转至步骤S408,否则,跳转至步骤S411。
[0061 ] 步骤S408,将当前节点压入节点栈中。
[0062]步骤S409,将当前节点设为最左的未访问子节点,最左是为保证子节点按从左至右顺序访问。子节点访问顺序对于一些SQL语句检测比较重要,比如检测SELECT语句时,一般先要确定语句操作对象,所以在编写语法文法时,会将FROM子句作为最左子节点,访问时从左至右访问。
[0063]步骤S410,将步骤S408所取得子节点标识为已访问,跳转至步骤S402。
[0064]步骤S411,访问完子节点后,再次调用静态检测组件,进行代码检查和度量,在检查和度量过程中,通过访问局部符号栈与全局符号树获取符号信息,通过访问注释表获取注释信息。具体的,以“WHERE条件中表达式是否存在隐式转换”检查为例,当节点传递给该检查组件时,该检查组件会判断该节点是否是WHERE条件中的关系表达式,如果不是,则不进行任何操作,如果是,则取表达式两边的符号,并从全局符号表和局部符号表中获得两边符号的类型,如果类型不同,即可确认存在隐式转换。
[0065]步骤S412,判断当前节点是否表示新作用域,如果是,则跳转至S413,否则跳转至S415o
[0066]步骤S413,从局部符号栈中弹出符号表。
[0067]步骤S414,判断节点栈是否为空,如果是,则表示语法树遍历结束,如果判断节点栈不为空,跳转至步骤S415。
[0068]步骤S415,从节点栈中取出一个节点,并赋给当前节点,跳转至步骤S402。
[0069]基于同一发明构思,本发明实施例中还提供了一种基于数据库字典的存储过程静态检测系统,如下面的实施例所述。由于该系统解决问题的原理与上述方法相似,因此该系统的实施可以参见上述方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的系统较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0070]结合图4所示,为本发明一实施例的基于数据库字典的存储过程静态检测系统结构示意图。该系统包括:
[0071]数据库访问单元I,用于建立与数据库字典服务器6的连接,并还可以为代码解析单元3提供数据库字典信息,数据字典内容包括存储过程对象、存储过程代码、存储过程引用的模式对象、模式对象信息等。
[0072]查询单元2,用于查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表。
[0073]代码解析单元3,用于通过数据访问单元I获取数据库用户下存储过程对象,包括程序包、独立存储过程、独立函数等。判断待检测对象列表中是否存在未检测的对象,如果有则对未检测的对象的存储过程进行代码解析,通过词法分析、语法分析技术生成语法树、注释表,并将该未检测的对象添加至全局符号树。
[0074]代码检测单元4,用于根据生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果。
[0075]报告生成单元5,用于根据静态检测结果生成静态检测报告。
[0076]在本实施例中,结合图5所示,为代码解析单元的结构示意图。如图5所示,代码解析单元3包括:词法分析组件31、语法分析组件32、注释管理组件33和全局符号管理组件34;其中,
[0077]词法分析组件31,用于对输入的代码字符流进行逐个扫描,从字符中识别出标识符、关键字、常量等相对独立的记号(Token),形成记号流。
[0078]语法分析组件32,用于在词法分析组件31输出的记号流基础上将独立的记号根据语法文法组建为抽象语法树。
[0079]注释管理组件33,用于利用词法分析组件31输出的记号流,构造注释表,记录每一段注释的起始、结束位置和注释内容。
[0080]全局符号管理组件34,用于通过分析存储过程所引用的对象,利用数据库字典和代码解析,获取符号的类别、数据类型等信息。符号表由同属于某作用域的符号或者同属于某对象的符号组织,符号表再按照从属关系组织成全局符号树。以存表为例,表的模式符号存放在根符号表中,表符号存放在一级符号表中,该符号表是模式符号的子符号表,字段符号存放在二级符号表,该符号表;^表符号的子符号表。
[0081]在本实施例中,结合图6所示,为代码检测单元的结构示意图。如图6所示,代码检测单元4包括:局部符号管理组件41和静态检测组件42;其中,
[0082]局部符号管理组件41,用于负责管理局部符号桟,包括符号表入桟、符号表出桟、在栈顶符号表中添加符号;在抽象语法树遍历时,根据语义获取符号信息,包括符号的类另IJ、数据类型,属于相同作用域的符号组织成局部符号表;其中,局部符号只从存储过程代码中获取,不会从数据库字典获取。
[0083]静态检测组件42,是一系列检查组件和度量组件的集合,用于完成实际静态测试任务;检查组件用于是检查存储过程是否存在缺陷或隐患,度量组件用于对存储过程的整体质量进行评估。比如WHERE条件中表达式是否存在隐式转换、游标显式打开后是否关闭等,而度量组件主要对存储过程的整体质量进行评估,比如圈复杂度、有效代码行数、存储过程调用深度等。代码检测单元4对语法树遍历时,会在遍历每个节点之前和之后都通知每个静态检测组件,每个组件根据自身需要,记录有用的节点信息,进行代码检查或度量。
[0084]本发明针对数据库特点,提出了一种基于数据库字典的存储过程静态检测方法及系统,相对于目前其他相关技术,其突出优点和有益效果是:
[0085]1、只需数据库的连接信息和数据库字典表的访问权限即可完成存储过程静态检测,改变现有静态检测方法对于代码文件的依赖;
[0086]2、数据字典包含的储过程代码、表、视图、类型等信息更加准确和完整,这使得静态检测能力更加强大,可检测WHERE条件中的隐式转换、判断SELECT INTO语句是否存在字符串长度溢出风险等;
[0087]3、对数据库无限制,可支持目前所有的数据库存储过程,并具备对新的数据库存储过程的扩充能力;
[0088]4、代码与注释的分离解析,既简化了语法分析过程,又保留了代码的完整信息,有利于针对注释的静态检测组件的开发;
[0089]5、主系统已解析出存储过程所有信息,包括抽象语法树、注释库与符号表,为复杂静态检测功能提供有效支持。
[0090]以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【主权项】
1.一种基于数据库字典的存储过程静态检测方法,其特征在于,该方法包括: 步骤I,建立与数据库字典服务器的连接; 步骤2,查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表; 步骤3,判断待检测对象列表中是否存在未检测的对象,如果存在则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树;步骤4,根据步骤3生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果; 步骤5,根据静态检测结果生成静态检测报告。2.根据权利要求1所述的基于数据库字典的存储过程静态检测方法,其特征在于,在步骤2中,存储过程对象包括:程序包、独立存储过程、独立函数、表结构、自定义类型。3.根据权利要求1所述的基于数据库字典的存储过程静态检测方法,其特征在于,在步骤3中,判断待检测对象列表中是否存在未检测的对象,如果有则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树,包括: 步骤301,判断待检测对象列表中是否存在未检测的对象,如果有则进入步骤302,如果没有进入步骤308; 步骤302,根据未检测对象的对象类型,判断未检测对象的对象信息是否在数据库字典中,如果是则跳转至步骤307,否则跳转至步骤303; 步骤303,从数据库字典中获取引用对象的代码; 步骤304,使用词法分析组件对引用对象的代码进行词法分析,获取记号流; 步骤305,使用语法分析组件分析记号流生成语法树; 步骤306,遍历语法树,将代码中的声明提取为符号,将符号添加至全局符号树中,跳转至步骤301; 步骤307,从数据库字典表中直接获取对象信息,将对象信息添加至全局符号树中,跳转至步骤301; 步骤308,从数据库字典中获取存储过程对象的代码; 步骤309,对存储过程对象的代码进行词法分析,形成存储过程对象的记号流; 步骤310,对存储过程对象的记号流进行注释分析,获得注释表; 步骤311,对存储过程对象的记号流进行语法分析,生成语法树。4.根据权利要求1所述的基于数据库字典的存储过程静态检测方法,其特征在于,在步骤4中,根据步骤3生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果,包括: 步骤401,将当前节点设置为根节点; 步骤402,判断当前节点是否表示新作用域,如果是新作用域则跳转至步骤403,否则跳转至步骤404; 步骤403,将新的空符号表通过局部符号管理组件压入局部符号栈中; 步骤404,判断当前节点是不是新符号,如果是新符号则跳转至步骤405,否则跳转至步骤406; 步骤405,将符号添加至局部符号堆栈中; 步骤406,调用静态检测组件,进行静态检测预处理,进行变量使用前必须赋值的检查时,标识变量符号被初始化状态; 步骤407,判断是否还存在未访问的子节点,如果是,则跳转至步骤408,否则,跳转至步骤411; 步骤408,将当前节点压入节点栈中; 步骤409,将当前节点设为最左的未访问子节点; 步骤410,将步骤408所取得子节点标识为已访问,跳转至步骤402; 步骤411,访问完子节点后,再次调用静态检测组件,进行代码检查和度量,在检查和度量过程中,通过访问局部符号栈与全局符号树获取符号信息,通过访问注释表获取注释信息; 步骤412,判断当前节点是否表示新作用域,如果是,则跳转至413,否则跳转至415; 步骤413,从局部符号桟中弹出符号表; 步骤414,判断节点栈是否为空,如果是,则表示语法树遍历结束。5.根据权利要求4所述的基于数据库字典的存储过程静态检测方法,其特征在于,在步骤414中,如果判断节点栈不为空,跳转至步骤415; 步骤415,从节点栈中取出一个节点,并赋给当前节点,跳转至步骤402。6.根据权利要求4所述的基于数据库字典的存储过程静态检测方法,其特征在于,在步骤402中的新作用域产生于存储过程的起始位置、SQL语句的起始位置。7.根据权利要求4所述的基于数据库字典的存储过程静态检测方法,其特征在于,在步骤404中的新符号产生于存储过程定义、变量定义、类型定义。8.一种基于数据库字典的存储过程静态检测系统,其特征在于,该系统包括: 数据库访问单元,用于建立与数据库字典服务器的连接; 查询单元,用于查询数据库字典表,获取当前数据库用户下的所有存储过程对象,并构建成为待检测对象列表; 代码解析单元,用于判断待检测对象列表中是否存在未检测的对象,如果有则对未检测的对象的存储过程进行代码解析,生成语法树、注释表,并将该未检测的对象添加至全局符号树; 代码检测单元,用于根据生成的语法树、注释表及全局符号树,在抽象语法树遍历过程中生成局部符号栈以及调用静态检测组件,并对未检测的对象的存储过程进行静态检测,获得静态检测结果; 报告生成单元,用于根据静态检测结果生成静态检测报告。9.根据权利要求8所述的基于数据库字典的存储过程静态检测系统,其特征在于,所述代码解析单元包括:词法分析组件、语法分析组件、注释管理组件和全局符号管理组件;其中, 词法分析组件,用于对输入的代码字符流进行逐个扫描,从字符中识别出标识符、关键字、常量等相对独立的记号,形成记号流; 语法分析组件,用于在词法分析组件输出的记号流基础上将独立的记号根据语法文法组建为抽象语法树; 注释管理组件,用于利用词法分析组件输出的记号流,构造注释表,记录每一段注释的起始、结束位置和注释内容; 全局符号管理组件,用于通过分析存储过程所引用的对象,利用数据库字典和代码解析,获取符号的类别、数据类型等信息。10.根据权利要求8所述的基于数据库字典的存储过程静态检测系统,其特征在于,代码检测单元包括:局部符号管理组件和静态检测组件;其中, 局部符号管理组件,用于负责管理局部符号桟,包括符号表入桟、符号表出桟、在桟顶符号表中添加符号;在抽象语法树遍历时,根据语义获取符号信息,包括符号的类别、数据类型,属于相同作用域的符号组织成局部符号表; 静态检测组件,是一系列检查组件和度量组件的集合,用于完成实际静态测试任务;检查组件用于是检查存储过程是否存在缺陷或隐患,度量组件用于对存储过程的整体质量进行评估。
【文档编号】G06F11/36GK105930267SQ201610237087
【公开日】2016年9月7日
【申请日】2016年4月15日
【发明人】魏亚东, 何正平, 姚辰, 许振峰
【申请人】中国工商银行股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1