基于XML中间模型以及缺陷模式匹配的静态检测系统.pdf

上传人:111****11 文档编号:976070 上传时间:2018-03-22 格式:PDF 页数:18 大小:566.37KB
返回 下载 相关 举报
摘要
申请专利号:

CN201110208958.6

申请日:

2011.07.25

公开号:

CN102339252A

公开日:

2012.02.01

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):G06F 11/36申请日:20110725授权公告日:20140423终止日期:20160725|||授权|||实质审查的生效IPC(主分类):G06F 11/36申请日:20110725|||公开

IPC分类号:

G06F11/36

主分类号:

G06F11/36

申请人:

大连理工大学

发明人:

周宽久; 赖晓晨; 王洁; 闫旭; 袁柱; 王喆; 汤乐敏

地址:

116100 辽宁省大连市凌工路2号

优先权:

专利代理机构:

大连理工大学专利中心 21200

代理人:

梅洪玉

PDF下载: PDF下载
内容摘要

本发明属于软件安全技术领域,涉及一种基于XML中间模型以及缺陷模式匹配的软件静态检测方法。其特征在于构造基于关系存储模式的关系语法树,以及基于XML格式的中间数据存储模型,经过预处理、词法分析、语法分析模块对待检测的源代码文件进行解析,提取出程序代码的所有安全关键属性信息,利用XML生成模块存储在XML中间文件中,由漏洞检测模块根据规则配置文件,提取规则库中相应规则,对前端生成的XML中间文件执行规则检测。

权利要求书

1: 一种基于 XML 中间模型以及缺陷模式匹配的静态检测方法, 其特征在于包括以下步 骤: (1) 静态检测系统的整体架构建立 本发明整体架构包括系统前端静态信息提取和系统后端漏洞检测两个功能模块 ; 系统 前端静态信息提取模块由预处理模块和源代码解析模块组成, 具体如下 : 1) 预处理模块 : 预处理模块首先将源代码文件读入内存, 对源文件中的特殊区域添加 标记, 标记添加的原则是 : 标记只分为两种, BEGIN 与 END ; BEGIN 与 END 之间的内容是需要 从后续的 .i 中恢复的内容 ; 标记之外的内容是源代码中的所有预处理指令 ; 系统通过调用 G++-E-C 对添加了标记的代码文件进行预处理, 生成含有标记信息的 .i 文件 ; 通过分别从添入标记的源代码文件和带有标记的 .i 文件中分别提取相应信息, 即可 获得符合规定的预处理后的文件 ; 其中, 从添入标记的源代码文件中提取出所有预处理指 令及它们在源代码文件中的各自的行号, 从带有标记信息的 .i 文件中提取两个标记之间 的所有代码 ; 2) 源代码解析模块 : 源代码解析模块按照功能可划分为词法分析模块、 语法分析模块 和 XML 生成模块 ; 代码解析器以 LEX、 YACC 描述脚本构造词法分析器和语法分析器, 对通过 GCC 编译生成的 .i 文件进行解析, 从中识别出代码类型、 文本、 行号以及变量、 函数声明 ; 这 些信息被存储在系统内部临时 “数据池” 中, 经 XML 生成模块的处理, 依据设计的 XML 中间 模型的结构, 将解析出的数据信息存储在 XML 文件中 ; 系统后端漏洞检测模块 : 负责对系统前端生成的特定格式的 XML 文件执行规则检测 ; 安全规则库中存储着安全规则, 针对已经转换为 XML 中间文件的检测对象, 规则以适宜检 测 XML 文件的一种形式存储在安全规则库中 ; 规则配置文件中存储每次规则检测时用户进 行的一些系统配置信息 ; 系统后端通过读入 XML 中间文件、 规则配置文件以及安全知识库, 输出检测结果 ; (2) 基于关系存储模式的关系语法树的构建 语法树构造算法如下 : 给定文法 G 和 Statement( 语句 ) 流 s, 记 s = s1s
2: ..sn( 其中 si ∈ VT, i = 1, 2...n), si = t1it2i...tmi( 其中 tki ∈ VT, k = 1, 2...m) ; 识别器自左向 右扫描 s, 每扫过一个 tki, 执行一个状态集 Pi(Pi ∈ P), 其中每个状态形如< A → α·β, Treeid(ti, d), Treecode(sj, h) >, A → α·β 表示 α 为已分析部分, Treeid(ti, d) 表示 ID 树当前最后加入节点为 ti, Treecode(sj, h) 表示 STMT 树当前最后加入的节点为 sj, d 等于 ID 树节点当前深度, h 值指示 STMT 树语句块的当前嵌套层次, |d-h| ≤ 1 ; 其中, VT 为非空终结 符集合, VN 为非终结符的非空集合, 为运算符集合, Vt” 为非运算符集合, Vt’ ∪ Vt” = VT, CFG( 上下文无关文法 )G = (VN, VT, S, P), S ∈ VN, 是文 法 G 的开始符号, P 是产生式集合 : P = {A → α|A ∈ VN, α ∈ (VNUVT)*} (1) 设 VN 中所有的非终结符 A 都可定义一个 CFG GA = (VN, VT, A, P), 其中 A 称为开始符 号, GA 产生一个上下文无关语言 L(GX), 则 L(GX) 中的每个句子 w 对应一棵派生树, 派生树 也称生成树、 分析树、 语法树 ; 设有 CFG G = (VN, VT, P, S), G 的语法树是满足如下条件的有序树 : 树的每个节点有 2 一个标记 X, 且 X ∈ VN ∪ VT ∪ {ε}, ε 表示空 ; 树根的标记为 S, S ∈ Vt’ ; 如果一个非叶 子节点 v 标记为 A, v 的子节点从左到右依次为 v1, v2, ..., vn, 并且它们分别被标记为 X1, X2, ...Xn, 则 A → X1X2...Xn ∈ P ; 如果 X 是一个非叶子节点的标记, 则 X ∈ Vt’ ; 如果一个节 点 v 标记为 ε, 则 v 是该树的叶子, 并且 v 是其父节点的唯一子节点 ; (3)XML 中间模型的建立 1)XML 文件模型 每个关系语法树在 XML 中间模型中均对应一个 SOURCEFILE 节点, SOURCEFILE 节点是 XML 模型的顶层节点, 具有两个属性 : 文件路径 (FILEPATH) 和文件类型 (FILETYPE) ; XML 文件模型下引出四个子模型 : 头文件引入模型 (FILEINCLUDE)、 注释信息模型 (COMMENTS)、 语句结构模型 (CODELINES)、 标识符信息模型 (INDENTIFIERS) ; 头文件引入模型存储关系语法树中文件包含语句的信息, 包含文件可能是用户自定义 文件或系统文件, 通过设定 FILEINCLUDE 的属性节点 TYPE 来区分包含文件的不同类型 ; 注释信息模型以语句为单位集中记录所有注释内容, 源代码中每行注释都映射为一个 CODELINE 子节点 ; 语句结构模型以语句为单位结构化地描述代码组织形式, 源代码中每条语句映射为一 个 CODELINE 子节点, 使用 SUBLINE 标签划分嵌套子语句 ; 标识符信息模型记录文件中定义的标识符信息, 包括所有变量、 函数名、 类名及标号, 每个标识符生成一个相应的 ID 子节点 ; 2) 语句结构模型的 XML Schema 结构如下 : A. 语句类型 (CODETYPE) : XML 中间模型将 C++ 语句类型划分为 76 类, 使 C++ 语言中的 所有语句均有一个唯一的名称 ; B. 行号 (LINENUMBER) : 系统在检测出违反安全规则的软件缺陷后, 需要向用户提供源 代码中违反规则的缺陷所在行号 ; C. 语句文本 (CODETEXT) : 某些规则的实现需要通过正则表达式分析语句文本, XML 中 间模型用专门节点标记语句文本 ; D. 子语句 (SUBLINES) : SUBLINES 通常含有大量 CODELINE 子节点, 代表复合语句中的 子语句 ; 3) 标识符信息模型用 WSDL 表示如下 : A. 标识符类型 (IDTYPE) : 可取值包括、 量、 函数定义、 类、 类模板共 35 种类型 ; B. 行号 (LINENUMBER) : ID 的属性节点, 记录标识符第一次出现的位置 ; ID 含有许多子 节点, 均作为可选项, 是否使用由 IDTYPE 以及标识符在源代码中的上下文环境而定 ; C. 名字 (NAME) : 记录标识符的名称 ; D. 类型 (TYPE) : 可选子节点 TYPE 根据 IDTYPE 的取值不同具有不同的含义, 可以使变 量声明的数据类型、 函数返回类型或结构类型等 ; E. 存储类型标识 (STORETYPE) : 该节点只应用在变量和函数中, 用于记录变量和函数 在声明时的存储类别 ; F. 赋值记录 (ASSIGNMENT) : 记录变量初始化值以及初始化后的再赋值, 记录项之间使 用分号隔开 ; G. 常量 (CONST) : 用于记录类的成员函数是否是被 const 修饰的常量成员函数, 写在函 3 数的最后来修饰 ; XML 中间模型中, CONST 节点不用于指示普通常量 ; H. 访问标号 (ACCESS) : 记录类、 结构体和联合体成员的访问标号 ; ACCESS 有 private、 public、 protected 三个取值 ; I. 所属结构 (OWNER) : 记录类、 结构体、 联合体和命名空间成员的所在类、 结构体、 联合 体或命名空间的名称 ; J. 虚函数标记 (VIRTUAL) : 用于指示类成员函数是否是虚函数 ; K. 运算符重载 (OPERATE) : 用于记录 C++ 中可重载的 42 种重载操作符 ; L. 参数 (PARAMETER) : 记录函数定义和声明的参数信息 ; 函数参数列表的每个参数项 都被映射为 PARAMETER 节点下的一个 ID 子节点, 按参数顺序存放 ; M. 域 (FIELD) : 复合语句中定义的变量是局部变量, XML 中间模型中使用 FIELD 记录这 些变量, 变量的可见域不超过所属 FIELD 块的作用域 ; N. 基类 (PARENT) : 记录派生类继承自哪些基类 ; PARENT 节点有一个用于记录类派生列 表中派生类对每个基类的继承权限的属性节点 ; O. 模板 (TEMPLATE) : 记录模板定义和声明的模板参数信息 ; 模板参数列表的每个参数 项都被映射为 TEMPLATE 节点下的一个 ID 子节点, 按参数顺序存放。

说明书


基于 XML 中间模型以及缺陷模式匹配的静态检测系统

    【技术领域】
     本发明属于软件检测技术领域, 涉及一种基于 XML 中间模型以及缺陷模式匹配的 静态检测方法。背景技术
     目前, 检测软件安全漏洞的方法主要有动态测试和静态分析。
     动态测试方法通过软件的实际执行来发现软件中的错误, 由于只能对有限的测试 用例进行检查, 所以不能保证发现软件的所有安全漏洞。
     静态分析不编译运行程序, 而是通过对程序源代码进行分析以发现其中的错误, 能在早期发现 30 %~ 70 %的逻辑设计和编码缺陷引入的安全漏洞而。静态分析技术通 过对源代码进行检查, 往往能在开发早期发现软件隐含的安全问题, 提高程序的可靠性 和健壮性。尽管静态分析方法可能产生一定的漏报 (false negatives) 或误报 (false positives), 但仍然是当今最实用、 最有效的安全漏洞检测方法之一。在实际使用中, 静态 测试能快速找到软件安全缺陷, 比动态测试更有效率。 目前, 软件安全静态分析技术主要分 为模型检测、 词法分析、 类型推导、 符号执行、 定理证明等。其中, 模型检测是一种验证有限 状态的并发系统的方法, 基本思想是对于有限状态的系统构造状态机或者有向图等抽象模 型, 再对模型进行遍历以验证系统的某一性质。模型检测的难点在于如何避免状态空间爆 炸。为此人们提出了多种方法。其中符号化模型检测方法是将抽象模型中的状态转换为逻 辑公式, 然后判定公式的可满足性。 还可将模型转化成自动机, 同时将需要检查的公式转换 为一个等价的自动机, 再将此自动机取补。 这两个自动机的积构成了一个新的自动机, 则判 定模型是否具有某一属性的问题就转换成检查这个新自动机能接受的语言是否为空。 发明内容 本发明提供了一种基于 XML 中间模型以及缺陷模式匹配的源代码静态检测方法, 通过构造基于关系存储模式的关系语法树, 以及基于 XML 的中间数据存储模型, 将源代码 安全属性信息提取并存储到 XML 中间模型中, 以供规则检测器进行规则匹配和缺陷检测。
     本发明的技术方案如下 :
     1、 静态检测系统的整体架构建立
     本发明整体架构包括系统前端静态信息提取和系统后端漏洞检测两个功能模块。
     系统前端静态信息提取模块由预处理模块和源代码解析模块组成, 负责对待检测 代码源文件进行预处理和语法制导的解析, 提取所需静态信息 ( 即安全编程规则所涉及的 所有代码信息 ), 构建关系语法树, 并根据制定的 XML 中间模型生成 XML 文件 ; 具体如下 :
     1) 预处理模块 : 完成对源代码文件的宏替换功能, 该功能的实现借用 G++ 的预处 理器辅助完成。预处理后将生成 .i 文件。
     G++ 预处理将执行源代码中的所有预处理指令。由于源代码中的所有预处理指令 均是规则检测的对象, 所以我们需要将所有的预处理指令重新恢复到源代码文件中。 同时,
     由于文件包含指令的执行, 使源代码文件中被引入了大量的代码, 尤其是引入了大量的 C++ 标准库文件, 但这是标准库文件中的代码并不是我们检测的对象, 需要从将其删除。
     预处理模块首先将源代码文件读入内存, 对源文件中的特殊区域添加标记, 标记 添加的原则是 : 标记只分为两种, BEGIN 与 END ; BEGIN 与 END 之间的内容是需要从后续的 .i 中恢复的内容 ; 标记之外的内容是源代码中的所有预处 理指令。
     系统通过调用 G++-E-C 对添加了标记的代码文件进行预处理, 生成含有标记信息 的 .i 文件。 通过分别从添入标记的源代码文件和带有标记的 .i 文件中分别提取相应信息, 即可获得符合规定的预处理后的文件。其中, 从添入标记的源代码文件中提取出所有预处 理指令及它们在源代码文件中的各自的行号, 从带有标记信息的 .i 文件中提取两个标记 之间的所有代码。
     2) 源代码解析模块 : 主要完成对源代码文件的转换, 即将源代码文件转换成为 XML 文件。源代码解析模块按照功能可划分为词法分析模块、 语法分析模块和 XML 生成模 块。代码解析器以 LEX、 YACC 描述脚本构造词法分析器和语法分析器, 对通过 GCC 编译生成 的 .i 文件进行解析, 从中识别出代码类型、 文本、 行号以及变量、 函数声明等数据信息。这 些信息被存储在系统内部临时 “数据池” 中, 经 XML 生成模块的处理, 依据设计的 XML 中间 模型的结构, 将解析出的数据信息存储在 XML 文件中。 系统后端漏洞检测模块 : 负责对系统前端生成的特定格式的 XML 文件执行规则检 测。安全规则库中存储着安全规则, 针对已经转换为 XML 中间文件的检测对象, 规则以适宜 检测 XML 文件的一种形式存储在安全规则库中。规则配置文件中存储每次规则检测时用户 进行的一些系统配置信息。系统后端通过读入 XML 中间文件、 规则配置文件以及安全知识 库, 输出检测结果。
     2、 基于关系存储模式的关系语法树的构建
     鉴于 GCC 编译产生的 AST 文本中含有大量的静态检测价值极低的冗余信息, 因此 需要利用 Lex、 Yacc 对源代码进行解析, 对产生冗余信息的语句进行特殊处理。例如 : 对于 源代码文件中的文件包含预处理指令, 在关系语法树模型中, 该指令对应一个普通节点。 节 点只记录该语句的文本内容和在源代码文 件中出现的位置信息, 摒弃其对应的头文件的 内容。 通过类似的处理, 去除绝大多数的冗余信息, 继而降低后续信息提取的难度并提高信 息检索的精度。
     编译器以源程序的过程为单位生成抽象语法树, 语法树构造算法为过程中每一种 语句构造定义相应的运算符, 并以运算符作为树的内部节点。 对于以关键字开头的构造, 使 用这个关键字作为对应的运算符。加减乘除等数学算法作为数学子表达式的运算符。
     关系存储模式根据终结符之间的依存关系建模, 内部节点去除数学运算符, 增加 表达式、 标识符等运算符。 对于以关键字开头的构造, 仍然使用这个关键字作为对应的运算 符。表达式语句不以某个关键字开头, 故定义一个新运算符 expression 表示表达式语句, 用叶子节点 null 表示一个空语句序列。标识符的运算符分为 variable、 function 等。树 的节点之间存在父子或兄弟关系, 使用相关指针进行链接。 根据静态检查需要, 分别生成 ID 树与 STMT 树。ID 树存放词法单元的属性集, STMT 树存放各类语句的语法结构信息。
     语法树构造算法的基本思想如下 : 给定文法 G 和 Statement( 语句 ) 流 s, 记s= s1s2...sn( 其中 si ∈ VT, i = 1, 2...n), si = t1it2i...tmi( 其中 tki ∈ VT, k = 1, 2...m) ;
     识别器自左向右扫描 s, 每扫过一个 tki, 执行一个状态集 Pi(Pi ∈ P), 其中每个状态形如 < A → α· β, Treeid(ti, d), Treecode(sj, h) >, A → α· β 表示 α 为已分析部分, Treeid(ti, d) 表示 ID 树当前最后加入节点为 ti, Treecode(sj, h) 表示 STMT 树当前最后加入的节点为 sj, d 等于 ID 树节点当前深度, h 值指示 STMT 树语句块的当前嵌套层次, |d-h| ≤ 1。
     其中, VT 为非空终结符集合, VN 为非终结符的非空集合,为运算符集合, Vt” 为非运算符集合,Vt’ ∪ Vt” = VT, CFG( 上下文无关文法 )G= (VN, VT, S, P), S ∈ VN, 是文法 G 的开始符号, P 是产生式集合 :
     P = {A → α|A ∈ VN, α ∈ (VNUVT)*} (1)
     设 VN 中所有的非终结符 A 都可定义一个 CFG GA = (VN, VT, A, P), 其中 A 称为开 始符号, GA 产生一个上下文无关语言 L(GX), 则 L(GX) 中的每个句子 w 对应一棵派生树, 派 生树也称生成树、 分析树、 语法树。
     设有 CFG G = (VN, VT, P, S), G 的语法树是满足如下条件的有序树 : 树的每个节点 有一个标记 X, 且 X ∈ VN ∪ VT ∪ {ε}, ε 表示空 ; 树根的标记为 S, S ∈ Vt’ ; 如果一个非 叶子节点 v 标记为 A, v 的子节点从左到右依次为 v1, v2, ..., vn, 并且它们分别被标记为 X1, X2, ...Xn, 则 A → X1X2...Xn ∈ P ; 如果 X 是一个非叶子节点的标记, 则 X ∈ Vt’ ; 如果一个节 点 v 标记为 ε, 则 v 是该树的叶子, 并且 v 是其父节点的唯一子节点。
     3、 XML 中间模型的建立
     将关系语法树以 XML 格式存储, 构造 XML 中间模型。 XML 中间模型的设计包括以下 几方面 :
     1)XML 文件模型
     XML 模型需具备良好结构, 且 XML 模型中各节点和属性项的含义均具有确定性和 唯一性。通过对 C++ 安全规则中所提取的具有检测价值的静态属性进行分析, 使用 XML Schema 构建如附图 3 的 XML 文件模型的结构。
     每个关系语法树在 XML 中间模型中均对应一个 SOURCEFILE 节点, SOURCEFILE 节 点是 XML 模型的顶层节点, 具有两个属性 : 文件路径 (FILEPATH) 和文件类型 (FILETYPE)。
     XML 文件模型下引出四个子模型 : 头文件引入模型 (FILEINCLUDE)、 注释信息模型 (COMMENTS)、 语句结构模型 (CODELINES)、 标识符信息模型 (INDENTIFIERS)。
     头文件引入模型存储关系语法树中文件包含语句的信息, 包含文件可能是用户自 定义文件或系统文件, 通过设定 FILEINCLUDE 的属性节点 TYPE 来区分包含文件的不同类 型。
     注释信息模型以语句为单位集中记录所有注释内容, 源代码中每行注释都映射为 一个 CODELINE 子节点。
     语句结构模型以语句为单位结构化地描述代码组织形式, 源代码中每条语句映射 为一个 CODELINE 子节点, 使用 SUBLINE 标签划分嵌套子语句。
     标识符信息模型记录文件中定义的标识符信息, 包括所有变量、 函数名、 类名及标 号等, 每个标识符生成一个相应的 ID 子节点。
     2) 语句结构模型
     语句结构信息以 C++ 语言语句为单位, 能够体现源代码中每一行代码的具体含 义及其所在行的上下文环境信息。源代码中每一条语句在 XML 中间模型中都对应一个CODELINE 节点。 每一个语句信息单元需要包含语句类型、 行号、 语句文本及可选的子语句信 息。语句结构模型用 WSDL 表示如附图 4 所示。
     所有语句在 XML 中间模型中均映射为一个 CODELINE 节点, 包含属性节点 CODETYPE 和 LINENUMBER, 以及节点 CODETEXT 和可选节点 SUBLINES。复合语句以 SUBLINES 为父节点 进行扩展, 内部嵌套的多条语句统一置于子节点 SUBLINES 下。 语句结构模型的 XML Schema 结构具体设计如下 :
     A. 语句类型 : CODETYPE
     XML 中间模型将 C++ 语句类型划分为 76 类, 使 C++ 语言中的所有语句均有一个唯 一的名称。
     B. 行号 : LINENUMBER
     系统在检测出违反安全规则的软件缺陷后, 需要向用户提供源代码中违反规则的 缺陷所在行号。
     C. 语句文本 : CODETEXT
     某些规则的实现需要通过正则表达式分析语句文本, 例如规则中禁止使用二合字 母词, 所以 XML 中间模型用专门节点标记语句文本。 D. 子语句 : SUBLINES
     SUBLINES 通常含有大量 CODELINE 子节点, 代表复合语句中的子语句。
     3) 标识符信息模型
     标识符信息模型描述源代码中标识符的属性集和作用域信息。 XML 中间模型中, 源 代码定义的每个标识符都映射到 IDENTIFERS 节点下的一个 ID 子节点, ID 节点的每个属性 节点和子节点记录了对应标识符的名字、 类型、 存储类型等信息。标识符信息模型用 WSDL 表示如附图 5 所示。
     标识符信息模型详细设计如下 :
     A. 标识符类型 : IDTYPE
     在源代码中, 标识符可能是变量名、 函数名或者是自定义类型等, 通过设定属性节 点 IDTYPE 区分不同标识符。IDTYPE 可取值包括、 量、 函数定义、 类、 类模板等 35 种类型。
     B. 行号 : LINENUMBER
     ID 的属性节点, 记录标识符第一次出现的位置。ID 含有许多子节点, 均作为可选 项, 是否使用由 IDTYPE 以及标识符在源代码中的上下文环境而定。
     C. 名字 : NAME
     记录标识符的名称。
     D. 类型 : TYPE
     可选子节点 TYPE 根据 IDTYPE 的取值不同具有不同的含义, 可以使变量声明的数 据类型、 函数返回类型或结构类型等。
     E. 存储类型标识 : STORETYPE
     该节点只应用在变量和函数中, 用于记录变量和函数在声明时的存储类别。
     F. 赋值记录 : ASSIGNMENT
     记录变量初始化值以及初始化后的再赋值, 记录项之间使用分号隔开。
     G. 常量 : CONST
     用于记录类的成员函数是否是被 const 修饰的常量成员函数, 写在函数的最后来 修饰。XML 中间模型中, CONST 节点不用于指示普通常量。
     H. 访问标号 : ACCESS
     记录类、 结构体和联合体成员的访问标号。ACCESS 有 private、 public、 protected 三个取值。
     I. 所属结构 : OWNER
     记录类、 结构体、 联合体和命名空间成员的所在类、 结构体、 联合体或命名空间的 名称。
     J. 虚函数标记 : VIRTUAL
     用于指示类成员函数是否是虚函数。
     K. 运算符重载 : OPERATE
     用于记录 C++ 中可重载的 42 种重载操作符。
     L. 参数 : PARAMETER
     记录函数定义和声明的参数信息。函数参数列表的每个参数项都 被映射为 PARAMETER 节点下的一个 ID 子节点, 按参数顺序存放。
     M. 域 : FIELD
     复合语句中定义的变量是局部变量, XML 中间模型中使用 FIELD 记录这些变量, 变 量的可见域不超过所属 FIELD 块的作用域。
     N. 基类 : PARENT
     记录派生类继承自哪些基类。 PARENT 节点有一个用于记录类派生列表中派生类对 每个基类的继承权限的属性节点。
     O. 模板 : TEMPLATE
     记录模板定义和声明的模板参数信息。模板参数列表的每个参数项都被映射为 TEMPLATE 节点下的一个 ID 子节点, 按参数顺序存放。
     本发明的有益效果是 :
     (1) 高效性 : 在遵守 XML 中间模型定义的前提下, 可实现系统前端静态信息提取和 后端漏洞检测模块的并行开发。
     (2) 面向对象语言的可扩展性 : 由于 XML 中间模型与检测语言和开发平台无关, 在 检测由其他编程语言开发的软件时, 只需更换与开发语言适应的系统前端解析器, 即可实 现特定语言的源代码静态检测, 具有多语言可拓展性。
     (3) 支持 《MISRA C++2008》 安全编程规范 : 本发明对软件安全缺陷检测的实现建 立在 《MISRA C++2008》 安全子集的基础上, 适合用于安全苛刻性系统, 如航空航天软件系 统、 医疗系统、 汽车电子系统和核工业系统等, 对 《MISRA C++2008》 具有良好支持性。 附图说明
     图 1 是本发明的系统架构图。
     图 2 是预处理模块的执行流程图。
     图 3 是 XML 文件模型的结构示意图。
     图 4 是语句结构模型用 WSDL 表示结构示意图。图 5 是标识符信息模型用 WSDL 表示结构示意图。 图 6 是 ID 树结构示意图。具体实施方式
     以下结合技术方案和附图, 详细叙述本发明的具体实施方式。
     下面的算法 1 描述了语法树的产生过程。
     算法 1.
     输入: CFG G = (VN, VT, S, P) 和 语 句 流 Statements = s1s2...sn,其 中 si = t1it2i...tmi.
     输出 : Treeid 和 Treestmt
     过程 : RSTree(G, s)
     1 begin
     2
     3 procedure CreateStmt{ 构造 Stmt 树 }
     4 for i : = 1 to n do
     5 procedure CreateId{ 构造 Id 树 } 6 for j : = 1 to m do * 7 begin/ begin of CreateId*/ 8 on current state Pk : =< A → αXβ, Treeid(ty, d), Treestmt(si-1, h) > 9 gettoken ; 10 if d ≠ h then 11 d = h ; 12 if X ∈ VN then 13 goto Ph(Ph ∈ P, h ≠ k) : =< X → η, Treeid(ty, d), Treestmt(si-1, h) > 14 else if X ∈ VT’ and X = tij then 15 createIdLeaf(Treeid(ty, d), X) ; 16 set Treeid(tij, d) ; 17 else if X = tij and X ∈ VT’ or X ∈ VT” ’ and X = ‘{‘then 18 d = d+1 ; 19 else if X ∈ VT and X = ‘}‘ 20 d = d-1 ; 21 else if Xβ = εthen 22 break ; 23 j = j-1 ; 24 end/*end of CreateId*/ 25 begin/*begin of CreateStmt*/ 26 CreateId ; 27 createStmtLeaf(Treestmt(si-1, h), si) ; 28 ifh ≠ d then29 h = d ;
     30 i = i-1 ;
     31 end/*end of CreateStmt*/
     32 end/*end ofRSTree*/
     给定如下所示的输入语句流 s :
     s0 : static int findMax(int arr[30])
     s1 : {
     s2 : int max = arr[0] ;
     s3 : for(int i = 1 ; i < 30 ; i++)
     s4 : max = (arr[i] > max) ? arr[i] : max ;
     s5 : return max ;
     s6 : }
     s 经过语法树构造算法 1 的运算后, 分别生成了附图 6(a) 所示的 STMT 树和附图 6 图 (b) 所示的 ID 树。分析可知, 关系语法树拥有节点 11 个, 包括两个头指针节点 Tree_ Stmt 和 Tree_Id。但若将输入 s 使用 G++ 生成传统抽象语法树, 分析其语法树文本 GXL, 可 发现语法树的节点数达到了 20 万多个。可见, 基于关系存储模式的关系语法树有效简化了 传统语法树的规模。 根据技术方案要点 3 所述的 XML 中间模型结构, 输入语句流 s 的关系语法树以 XML 格式存储, 经 XML 生成模块的处理, 最终转换为如下的 XML 文件 :
    

基于XML中间模型以及缺陷模式匹配的静态检测系统.pdf_第1页
第1页 / 共18页
基于XML中间模型以及缺陷模式匹配的静态检测系统.pdf_第2页
第2页 / 共18页
基于XML中间模型以及缺陷模式匹配的静态检测系统.pdf_第3页
第3页 / 共18页
点击查看更多>>
资源描述

《基于XML中间模型以及缺陷模式匹配的静态检测系统.pdf》由会员分享,可在线阅读,更多相关《基于XML中间模型以及缺陷模式匹配的静态检测系统.pdf(18页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN102339252A43申请公布日20120201CN102339252ACN102339252A21申请号201110208958622申请日20110725G06F11/3620060171申请人大连理工大学地址116100辽宁省大连市凌工路2号72发明人周宽久赖晓晨王洁闫旭袁柱王喆汤乐敏74专利代理机构大连理工大学专利中心21200代理人梅洪玉54发明名称基于XML中间模型以及缺陷模式匹配的静态检测系统57摘要本发明属于软件安全技术领域,涉及一种基于XML中间模型以及缺陷模式匹配的软件静态检测方法。其特征在于构造基于关系存储模式的关系语法树,以及基于XML格式的中间数据。

2、存储模型,经过预处理、词法分析、语法分析模块对待检测的源代码文件进行解析,提取出程序代码的所有安全关键属性信息,利用XML生成模块存储在XML中间文件中,由漏洞检测模块根据规则配置文件,提取规则库中相应规则,对前端生成的XML中间文件执行规则检测。51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书3页说明书9页附图5页CN102339265A1/3页21一种基于XML中间模型以及缺陷模式匹配的静态检测方法,其特征在于包括以下步骤1静态检测系统的整体架构建立本发明整体架构包括系统前端静态信息提取和系统后端漏洞检测两个功能模块;系统前端静态信息提取模块由预处理模块和源代码解析。

3、模块组成,具体如下1预处理模块预处理模块首先将源代码文件读入内存,对源文件中的特殊区域添加标记,标记添加的原则是标记只分为两种,BEGIN与END;BEGIN与END之间的内容是需要从后续的I中恢复的内容;标记之外的内容是源代码中的所有预处理指令;系统通过调用GEC对添加了标记的代码文件进行预处理,生成含有标记信息的I文件;通过分别从添入标记的源代码文件和带有标记的I文件中分别提取相应信息,即可获得符合规定的预处理后的文件;其中,从添入标记的源代码文件中提取出所有预处理指令及它们在源代码文件中的各自的行号,从带有标记信息的I文件中提取两个标记之间的所有代码;2源代码解析模块源代码解析模块按照功。

4、能可划分为词法分析模块、语法分析模块和XML生成模块;代码解析器以LEX、YACC描述脚本构造词法分析器和语法分析器,对通过GCC编译生成的I文件进行解析,从中识别出代码类型、文本、行号以及变量、函数声明;这些信息被存储在系统内部临时“数据池”中,经XML生成模块的处理,依据设计的XML中间模型的结构,将解析出的数据信息存储在XML文件中;系统后端漏洞检测模块负责对系统前端生成的特定格式的XML文件执行规则检测;安全规则库中存储着安全规则,针对已经转换为XML中间文件的检测对象,规则以适宜检测XML文件的一种形式存储在安全规则库中;规则配置文件中存储每次规则检测时用户进行的一些系统配置信息;系。

5、统后端通过读入XML中间文件、规则配置文件以及安全知识库,输出检测结果;2基于关系存储模式的关系语法树的构建语法树构造算法如下给定文法G和STATEMENT语句流S,记SS1S2SN其中SIVT,I1,2N,SIT1IT2ITMI其中TKIVT,K1,2M;识别器自左向右扫描S,每扫过一个TKI,执行一个状态集PIPIP,其中每个状态形如A,TREEIDTI,D,TREECODESJ,H,A表示为已分析部分,TREEIDTI,D表示ID树当前最后加入节点为TI,TREECODESJ,H表示STMT树当前最后加入的节点为SJ,D等于ID树节点当前深度,H值指示STMT树语句块的当前嵌套层次,|D。

6、H|1;其中,VT为非空终结符集合,VN为非终结符的非空集合,为运算符集合,VT”为非运算符集合,VTVT”VT,CFG上下文无关文法GVN,VT,S,P,SVN,是文法G的开始符号,P是产生式集合PA|AVN,VNUVT1设VN中所有的非终结符A都可定义一个CFGGAVN,VT,A,P,其中A称为开始符号,GA产生一个上下文无关语言LGX,则LGX中的每个句子W对应一棵派生树,派生树也称生成树、分析树、语法树;设有CFGGVN,VT,P,S,G的语法树是满足如下条件的有序树树的每个节点有权利要求书CN102339252ACN102339265A2/3页3一个标记X,且XVNVT,表示空;树根。

7、的标记为S,SVT;如果一个非叶子节点V标记为A,V的子节点从左到右依次为V1,V2,VN,并且它们分别被标记为X1,X2,XN,则AX1X2XNP;如果X是一个非叶子节点的标记,则XVT;如果一个节点V标记为,则V是该树的叶子,并且V是其父节点的唯一子节点;3XML中间模型的建立1XML文件模型每个关系语法树在XML中间模型中均对应一个SOURCEFILE节点,SOURCEFILE节点是XML模型的顶层节点,具有两个属性文件路径FILEPATH和文件类型FILETYPE;XML文件模型下引出四个子模型头文件引入模型FILEINCLUDE、注释信息模型COMMENTS、语句结构模型CODELI。

8、NES、标识符信息模型INDENTIFIERS;头文件引入模型存储关系语法树中文件包含语句的信息,包含文件可能是用户自定义文件或系统文件,通过设定FILEINCLUDE的属性节点TYPE来区分包含文件的不同类型;注释信息模型以语句为单位集中记录所有注释内容,源代码中每行注释都映射为一个CODELINE子节点;语句结构模型以语句为单位结构化地描述代码组织形式,源代码中每条语句映射为一个CODELINE子节点,使用SUBLINE标签划分嵌套子语句;标识符信息模型记录文件中定义的标识符信息,包括所有变量、函数名、类名及标号,每个标识符生成一个相应的ID子节点;2语句结构模型的XMLSCHEMA结构如。

9、下A语句类型CODETYPEXML中间模型将C语句类型划分为76类,使C语言中的所有语句均有一个唯一的名称;B行号LINENUMBER系统在检测出违反安全规则的软件缺陷后,需要向用户提供源代码中违反规则的缺陷所在行号;C语句文本CODETEXT某些规则的实现需要通过正则表达式分析语句文本,XML中间模型用专门节点标记语句文本;D子语句SUBLINESSUBLINES通常含有大量CODELINE子节点,代表复合语句中的子语句;3标识符信息模型用WSDL表示如下A标识符类型IDTYPE可取值包括、量、函数定义、类、类模板共35种类型;B行号LINENUMBERID的属性节点,记录标识符第一次出现的。

10、位置;ID含有许多子节点,均作为可选项,是否使用由IDTYPE以及标识符在源代码中的上下文环境而定;C名字NAME记录标识符的名称;D类型TYPE可选子节点TYPE根据IDTYPE的取值不同具有不同的含义,可以使变量声明的数据类型、函数返回类型或结构类型等;E存储类型标识STORETYPE该节点只应用在变量和函数中,用于记录变量和函数在声明时的存储类别;F赋值记录ASSIGNMENT记录变量初始化值以及初始化后的再赋值,记录项之间使用分号隔开;G常量CONST用于记录类的成员函数是否是被CONST修饰的常量成员函数,写在函权利要求书CN102339252ACN102339265A3/3页4数的。

11、最后来修饰;XML中间模型中,CONST节点不用于指示普通常量;H访问标号ACCESS记录类、结构体和联合体成员的访问标号;ACCESS有PRIVATE、PUBLIC、PROTECTED三个取值;I所属结构OWNER记录类、结构体、联合体和命名空间成员的所在类、结构体、联合体或命名空间的名称;J虚函数标记VIRTUAL用于指示类成员函数是否是虚函数;K运算符重载OPERATE用于记录C中可重载的42种重载操作符;L参数PARAMETER记录函数定义和声明的参数信息;函数参数列表的每个参数项都被映射为PARAMETER节点下的一个ID子节点,按参数顺序存放;M域FIELD复合语句中定义的变量是局。

12、部变量,XML中间模型中使用FIELD记录这些变量,变量的可见域不超过所属FIELD块的作用域;N基类PARENT记录派生类继承自哪些基类;PARENT节点有一个用于记录类派生列表中派生类对每个基类的继承权限的属性节点;O模板TEMPLATE记录模板定义和声明的模板参数信息;模板参数列表的每个参数项都被映射为TEMPLATE节点下的一个ID子节点,按参数顺序存放。权利要求书CN102339252ACN102339265A1/9页5基于XML中间模型以及缺陷模式匹配的静态检测系统技术领域0001本发明属于软件检测技术领域,涉及一种基于XML中间模型以及缺陷模式匹配的静态检测方法。背景技术0002。

13、目前,检测软件安全漏洞的方法主要有动态测试和静态分析。0003动态测试方法通过软件的实际执行来发现软件中的错误,由于只能对有限的测试用例进行检查,所以不能保证发现软件的所有安全漏洞。0004静态分析不编译运行程序,而是通过对程序源代码进行分析以发现其中的错误,能在早期发现3070的逻辑设计和编码缺陷引入的安全漏洞而。静态分析技术通过对源代码进行检查,往往能在开发早期发现软件隐含的安全问题,提高程序的可靠性和健壮性。尽管静态分析方法可能产生一定的漏报FALSENEGATIVES或误报FALSEPOSITIVES,但仍然是当今最实用、最有效的安全漏洞检测方法之一。在实际使用中,静态测试能快速找到软。

14、件安全缺陷,比动态测试更有效率。目前,软件安全静态分析技术主要分为模型检测、词法分析、类型推导、符号执行、定理证明等。其中,模型检测是一种验证有限状态的并发系统的方法,基本思想是对于有限状态的系统构造状态机或者有向图等抽象模型,再对模型进行遍历以验证系统的某一性质。模型检测的难点在于如何避免状态空间爆炸。为此人们提出了多种方法。其中符号化模型检测方法是将抽象模型中的状态转换为逻辑公式,然后判定公式的可满足性。还可将模型转化成自动机,同时将需要检查的公式转换为一个等价的自动机,再将此自动机取补。这两个自动机的积构成了一个新的自动机,则判定模型是否具有某一属性的问题就转换成检查这个新自动机能接受的。

15、语言是否为空。发明内容0005本发明提供了一种基于XML中间模型以及缺陷模式匹配的源代码静态检测方法,通过构造基于关系存储模式的关系语法树,以及基于XML的中间数据存储模型,将源代码安全属性信息提取并存储到XML中间模型中,以供规则检测器进行规则匹配和缺陷检测。0006本发明的技术方案如下00071、静态检测系统的整体架构建立0008本发明整体架构包括系统前端静态信息提取和系统后端漏洞检测两个功能模块。0009系统前端静态信息提取模块由预处理模块和源代码解析模块组成,负责对待检测代码源文件进行预处理和语法制导的解析,提取所需静态信息即安全编程规则所涉及的所有代码信息,构建关系语法树,并根据制定。

16、的XML中间模型生成XML文件;具体如下00101预处理模块完成对源代码文件的宏替换功能,该功能的实现借用G的预处理器辅助完成。预处理后将生成I文件。0011G预处理将执行源代码中的所有预处理指令。由于源代码中的所有预处理指令均是规则检测的对象,所以我们需要将所有的预处理指令重新恢复到源代码文件中。同时,说明书CN102339252ACN102339265A2/9页6由于文件包含指令的执行,使源代码文件中被引入了大量的代码,尤其是引入了大量的C标准库文件,但这是标准库文件中的代码并不是我们检测的对象,需要从将其删除。0012预处理模块首先将源代码文件读入内存,对源文件中的特殊区域添加标记,标记。

17、添加的原则是标记只分为两种,BEGIN与END;BEGIN与END之间的内容是需要从后续的I中恢复的内容;标记之外的内容是源代码中的所有预处理指令。0013系统通过调用GEC对添加了标记的代码文件进行预处理,生成含有标记信息的I文件。通过分别从添入标记的源代码文件和带有标记的I文件中分别提取相应信息,即可获得符合规定的预处理后的文件。其中,从添入标记的源代码文件中提取出所有预处理指令及它们在源代码文件中的各自的行号,从带有标记信息的I文件中提取两个标记之间的所有代码。00142源代码解析模块主要完成对源代码文件的转换,即将源代码文件转换成为XML文件。源代码解析模块按照功能可划分为词法分析模块。

18、、语法分析模块和XML生成模块。代码解析器以LEX、YACC描述脚本构造词法分析器和语法分析器,对通过GCC编译生成的I文件进行解析,从中识别出代码类型、文本、行号以及变量、函数声明等数据信息。这些信息被存储在系统内部临时“数据池”中,经XML生成模块的处理,依据设计的XML中间模型的结构,将解析出的数据信息存储在XML文件中。0015系统后端漏洞检测模块负责对系统前端生成的特定格式的XML文件执行规则检测。安全规则库中存储着安全规则,针对已经转换为XML中间文件的检测对象,规则以适宜检测XML文件的一种形式存储在安全规则库中。规则配置文件中存储每次规则检测时用户进行的一些系统配置信息。系统后。

19、端通过读入XML中间文件、规则配置文件以及安全知识库,输出检测结果。00162、基于关系存储模式的关系语法树的构建0017鉴于GCC编译产生的AST文本中含有大量的静态检测价值极低的冗余信息,因此需要利用LEX、YACC对源代码进行解析,对产生冗余信息的语句进行特殊处理。例如对于源代码文件中的文件包含预处理指令,在关系语法树模型中,该指令对应一个普通节点。节点只记录该语句的文本内容和在源代码文件中出现的位置信息,摒弃其对应的头文件的内容。通过类似的处理,去除绝大多数的冗余信息,继而降低后续信息提取的难度并提高信息检索的精度。0018编译器以源程序的过程为单位生成抽象语法树,语法树构造算法为过程。

20、中每一种语句构造定义相应的运算符,并以运算符作为树的内部节点。对于以关键字开头的构造,使用这个关键字作为对应的运算符。加减乘除等数学算法作为数学子表达式的运算符。0019关系存储模式根据终结符之间的依存关系建模,内部节点去除数学运算符,增加表达式、标识符等运算符。对于以关键字开头的构造,仍然使用这个关键字作为对应的运算符。表达式语句不以某个关键字开头,故定义一个新运算符EXPRESSION表示表达式语句,用叶子节点NULL表示一个空语句序列。标识符的运算符分为VARIABLE、FUNCTION等。树的节点之间存在父子或兄弟关系,使用相关指针进行链接。根据静态检查需要,分别生成ID树与STMT树。

21、。ID树存放词法单元的属性集,STMT树存放各类语句的语法结构信息。0020语法树构造算法的基本思想如下给定文法G和STATEMENT语句流S,记SS1S2SN其中SIVT,I1,2N,SIT1IT2ITMI其中TKIVT,K1,2M;说明书CN102339252ACN102339265A3/9页7识别器自左向右扫描S,每扫过一个TKI,执行一个状态集PIPIP,其中每个状态形如A,TREEIDTI,D,TREECODESJ,H,A表示为已分析部分,TREEIDTI,D表示ID树当前最后加入节点为TI,TREECODESJ,H表示STMT树当前最后加入的节点为SJ,D等于ID树节点当前深度,H。

22、值指示STMT树语句块的当前嵌套层次,|DH|1。0021其中,VT为非空终结符集合,VN为非终结符的非空集合,为运算符集合,VT”为非运算符集合,VTVT”VT,CFG上下文无关文法GVN,VT,S,P,SVN,是文法G的开始符号,P是产生式集合0022PA|AVN,VNUVT10023设VN中所有的非终结符A都可定义一个CFGGAVN,VT,A,P,其中A称为开始符号,GA产生一个上下文无关语言LGX,则LGX中的每个句子W对应一棵派生树,派生树也称生成树、分析树、语法树。0024设有CFGGVN,VT,P,S,G的语法树是满足如下条件的有序树树的每个节点有一个标记X,且XVNVT,表示空。

23、;树根的标记为S,SVT;如果一个非叶子节点V标记为A,V的子节点从左到右依次为V1,V2,VN,并且它们分别被标记为X1,X2,XN,则AX1X2XNP;如果X是一个非叶子节点的标记,则XVT;如果一个节点V标记为,则V是该树的叶子,并且V是其父节点的唯一子节点。00253、XML中间模型的建立0026将关系语法树以XML格式存储,构造XML中间模型。XML中间模型的设计包括以下几方面00271XML文件模型0028XML模型需具备良好结构,且XML模型中各节点和属性项的含义均具有确定性和唯一性。通过对C安全规则中所提取的具有检测价值的静态属性进行分析,使用XMLSCHEMA构建如附图3的X。

24、ML文件模型的结构。0029每个关系语法树在XML中间模型中均对应一个SOURCEFILE节点,SOURCEFILE节点是XML模型的顶层节点,具有两个属性文件路径FILEPATH和文件类型FILETYPE。0030XML文件模型下引出四个子模型头文件引入模型FILEINCLUDE、注释信息模型COMMENTS、语句结构模型CODELINES、标识符信息模型INDENTIFIERS。0031头文件引入模型存储关系语法树中文件包含语句的信息,包含文件可能是用户自定义文件或系统文件,通过设定FILEINCLUDE的属性节点TYPE来区分包含文件的不同类型。0032注释信息模型以语句为单位集中记录所。

25、有注释内容,源代码中每行注释都映射为一个CODELINE子节点。0033语句结构模型以语句为单位结构化地描述代码组织形式,源代码中每条语句映射为一个CODELINE子节点,使用SUBLINE标签划分嵌套子语句。0034标识符信息模型记录文件中定义的标识符信息,包括所有变量、函数名、类名及标号等,每个标识符生成一个相应的ID子节点。00352语句结构模型0036语句结构信息以C语言语句为单位,能够体现源代码中每一行代码的具体含义及其所在行的上下文环境信息。源代码中每一条语句在XML中间模型中都对应一个说明书CN102339252ACN102339265A4/9页8CODELINE节点。每一个语句。

26、信息单元需要包含语句类型、行号、语句文本及可选的子语句信息。语句结构模型用WSDL表示如附图4所示。0037所有语句在XML中间模型中均映射为一个CODELINE节点,包含属性节点CODETYPE和LINENUMBER,以及节点CODETEXT和可选节点SUBLINES。复合语句以SUBLINES为父节点进行扩展,内部嵌套的多条语句统一置于子节点SUBLINES下。语句结构模型的XMLSCHEMA结构具体设计如下0038A语句类型CODETYPE0039XML中间模型将C语句类型划分为76类,使C语言中的所有语句均有一个唯一的名称。0040B行号LINENUMBER0041系统在检测出违反安全。

27、规则的软件缺陷后,需要向用户提供源代码中违反规则的缺陷所在行号。0042C语句文本CODETEXT0043某些规则的实现需要通过正则表达式分析语句文本,例如规则中禁止使用二合字母词,所以XML中间模型用专门节点标记语句文本。0044D子语句SUBLINES0045SUBLINES通常含有大量CODELINE子节点,代表复合语句中的子语句。00463标识符信息模型0047标识符信息模型描述源代码中标识符的属性集和作用域信息。XML中间模型中,源代码定义的每个标识符都映射到IDENTIFERS节点下的一个ID子节点,ID节点的每个属性节点和子节点记录了对应标识符的名字、类型、存储类型等信息。标识符。

28、信息模型用WSDL表示如附图5所示。0048标识符信息模型详细设计如下0049A标识符类型IDTYPE0050在源代码中,标识符可能是变量名、函数名或者是自定义类型等,通过设定属性节点IDTYPE区分不同标识符。IDTYPE可取值包括、量、函数定义、类、类模板等35种类型。0051B行号LINENUMBER0052ID的属性节点,记录标识符第一次出现的位置。ID含有许多子节点,均作为可选项,是否使用由IDTYPE以及标识符在源代码中的上下文环境而定。0053C名字NAME0054记录标识符的名称。0055D类型TYPE0056可选子节点TYPE根据IDTYPE的取值不同具有不同的含义,可以使变。

29、量声明的数据类型、函数返回类型或结构类型等。0057E存储类型标识STORETYPE0058该节点只应用在变量和函数中,用于记录变量和函数在声明时的存储类别。0059F赋值记录ASSIGNMENT0060记录变量初始化值以及初始化后的再赋值,记录项之间使用分号隔开。0061G常量CONST说明书CN102339252ACN102339265A5/9页90062用于记录类的成员函数是否是被CONST修饰的常量成员函数,写在函数的最后来修饰。XML中间模型中,CONST节点不用于指示普通常量。0063H访问标号ACCESS0064记录类、结构体和联合体成员的访问标号。ACCESS有PRIVATE、。

30、PUBLIC、PROTECTED三个取值。0065I所属结构OWNER0066记录类、结构体、联合体和命名空间成员的所在类、结构体、联合体或命名空间的名称。0067J虚函数标记VIRTUAL0068用于指示类成员函数是否是虚函数。0069K运算符重载OPERATE0070用于记录C中可重载的42种重载操作符。0071L参数PARAMETER0072记录函数定义和声明的参数信息。函数参数列表的每个参数项都被映射为PARAMETER节点下的一个ID子节点,按参数顺序存放。0073M域FIELD0074复合语句中定义的变量是局部变量,XML中间模型中使用FIELD记录这些变量,变量的可见域不超过所属。

31、FIELD块的作用域。0075N基类PARENT0076记录派生类继承自哪些基类。PARENT节点有一个用于记录类派生列表中派生类对每个基类的继承权限的属性节点。0077O模板TEMPLATE0078记录模板定义和声明的模板参数信息。模板参数列表的每个参数项都被映射为TEMPLATE节点下的一个ID子节点,按参数顺序存放。0079本发明的有益效果是00801高效性在遵守XML中间模型定义的前提下,可实现系统前端静态信息提取和后端漏洞检测模块的并行开发。00812面向对象语言的可扩展性由于XML中间模型与检测语言和开发平台无关,在检测由其他编程语言开发的软件时,只需更换与开发语言适应的系统前端解。

32、析器,即可实现特定语言的源代码静态检测,具有多语言可拓展性。00823支持MISRAC2008安全编程规范本发明对软件安全缺陷检测的实现建立在MISRAC2008安全子集的基础上,适合用于安全苛刻性系统,如航空航天软件系统、医疗系统、汽车电子系统和核工业系统等,对MISRAC2008具有良好支持性。附图说明0083图1是本发明的系统架构图。0084图2是预处理模块的执行流程图。0085图3是XML文件模型的结构示意图。0086图4是语句结构模型用WSDL表示结构示意图。说明书CN102339252ACN102339265A6/9页100087图5是标识符信息模型用WSDL表示结构示意图。008。

33、8图6是ID树结构示意图。具体实施方式0089以下结合技术方案和附图,详细叙述本发明的具体实施方式。0090下面的算法1描述了语法树的产生过程。0091算法10092输入CFGGVN,VT,S,P和语句流STATEMENTSS1S2SN,其中SIT1IT2ITMI0093输出TREEID和TREESTMT0094过程RSTREEG,S00951BEGIN0096200973PROCEDURECREATESTMT构造STMT树00984FORI1TONDO00995PROCEDURECREATEID构造ID树01006FORJ1TOMDO01017BEGIN/BEGINOFCREATEID/01。

34、028ONCURRENTSTATEPKAX,TREEIDTY,D,TREESTMTSI1,H01039GETTOKEN;010410IFDHTHEN010511DH;010612IFXVNTHEN010713GOTOPHPHP,HKX,TREEIDTY,D,TREESTMTSI1,H010814ELSEIFXVTANDXTIJTHEN010915CREATEIDLEAFTREEIDTY,D,X;011016SETTREEIDTIJ,D;011117ELSEIFXTIJANDXVTORXVT”ANDXTHEN011218DD1;011319ELSEIFXVTANDX011420DD1;01152。

35、1ELSEIFXTHEN011622BREAK;011723JJ1;011824END/ENDOFCREATEID/011925BEGIN/BEGINOFCREATESTMT/012026CREATEID;012127CREATESTMTLEAFTREESTMTSI1,H,SI;012228IFHDTHEN说明书CN102339252ACN102339265A7/9页11012329HD;012430II1;012531END/ENDOFCREATESTMT/012632END/ENDOFRSTREE/0127给定如下所示的输入语句流S0128S0STATICINTFINDMAXINTARR3。

36、00129S10130S2INTMAXARR0;0131S3FORINTI1;I30;I0132S4MAXARRIMAXARRIMAX;0133S5RETURNMAX;0134S60135S经过语法树构造算法1的运算后,分别生成了附图6A所示的STMT树和附图6图B所示的ID树。分析可知,关系语法树拥有节点11个,包括两个头指针节点TREE_STMT和TREE_ID。但若将输入S使用G生成传统抽象语法树,分析其语法树文本GXL,可发现语法树的节点数达到了20万多个。可见,基于关系存储模式的关系语法树有效简化了传统语法树的规模。0136根据技术方案要点3所述的XML中间模型结构,输入语句流S的关。

37、系语法树以XML格式存储,经XML生成模块的处理,最终转换为如下的XML文件0137说明书CN102339252ACN102339265A8/9页120138说明书CN102339252ACN102339265A9/9页13说明书CN102339252ACN102339265A1/5页14图1图2说明书附图CN102339252ACN102339265A2/5页15图3说明书附图CN102339252ACN102339265A3/5页16图4说明书附图CN102339252ACN102339265A4/5页17图5说明书附图CN102339252ACN102339265A5/5页18图6说明书附图CN102339252A。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1