一种内存访问溢出的检测方法及装置的制造方法

文档序号:8259373阅读:198来源:国知局
一种内存访问溢出的检测方法及装置的制造方法
【技术领域】
[0001] 本申请涉及计算机编译领域,特别是涉及一种内存访问溢出的检测方法及装置。
【背景技术】
[0002] 内存访问溢出是导致C语言程序出现漏洞的根本原因之一,它通常表现为数组越 界访问、栈溢出等关键问题。这些关键问题可能导致程序在运行期出现很难预测的结果,既 可能正常运行,也可能导致程序崩溃,这将在测试时给程序员带来极大的困扰。归其原因, 它们都是由于程序未按照理想约束条件下进行内存访问。因此,如何尽可能的检测、判断可 能存在漏洞,并尽可能的减少误判率是目前的研宄热点和难点。
[0003] -般而言,内存访问溢出检测分为静态检测与动态检测两部分的内容,内存访问 溢出的静态检测是将内存访问溢出的问题转换为约束求解问题,并配合模型检验方法来建 立约束,模型检验方法具有很高的可靠性和完备性,理论上能保证没有误报和漏报,并且能 全自动地实施。已有的内存访问溢出的静态检测方法,都是通过遍历状态空间,将所有可能 存在内存访问溢出的代码全部检测出,并将这些代码进行报告。
[0004] 然而,现实情况下,状态空间由于循环结构、跳转分支可能无穷大,而遍历状态空 间所花费的空间和时间代价却是无法承受,而且由于源代码中的函数、循环较多,现有的检 测方法可以处理简单循环,但无法处理递归等复杂结构,很难在资源受限的条件下遍历全 部的状态空间,因此存在较高的漏报和误报。

【发明内容】

[0005] 有鉴于此,本申请实施例提供一种内存访问溢出的检测方法及装置,以减少遍历 状态空间所花费的空间和时间代价,且减少对于内存访问溢出的漏报和误报。
[0006] 为了实现上述目的,本申请实施例提供的技术方案如下:
[0007] 一种内存访问溢出的检测方法,包括:
[0008] 对源代码进行预处理和词法分析、语法分析以及语义分析,生成控制流图、数据依 赖图以及抽象语义树;
[0009] 针对不同的检测场景建立多种检测模型,并根据多种检测模型分析所述控制流 图、数据依赖图以及抽象语义树,进行表达式迭代以及状态空间遍历,输出检测结果;
[0010] 根据所述检测结果判断所述源代码中是否存在内存访问溢出,并对检测出的内存 访问溢出进行反馈输出。
[0011] 优选地,所述对源代码进行预处理和词法分析、语法分析以及语义分析,生成控制 流图、数据依赖图以及抽象语义树,包括:
[0012] 对所述源代码进行词法分析和语法分析,并基于词法分析和语法分析的结果进行 语义分析以及上下文分析,生成抽象语义树;
[0013] 根据所述源代码的分支跳转和函数调用关系,将所述源代码切分为多个基本块, 并分析每个基本块之间的跳转关系,根据所述跳转关系生成控制流图;
[0014] 分析所述源代码的变量之间的数据依赖关系,生成数据依赖图。
[0015] 优选地,所述针对不同场景建立多种检测模型,并根据多种检测模型分析所述控 制流图、数据依赖图以及抽象语义树,进行表达式迭代以及状态空间遍历,包括:
[0016] 针对不同的检测场景定义多种检测模型,所述检测模型包括:指针操作模型、数组 访问模型、标准库函数模型和循环体与抽象迭代模型;
[0017] 对所述控制流图和所述数据依赖图进行剪裁,沿所述控制流图和所述数据依赖图 中的路径将常量节点依次向后继节点传递,并计算常量表达式,通过操作符连接并迭代内 存访问操作的输入条件,进行表达式迭代并得到所述输入条件的迭代结果;
[0018] 扫描所述抽象语义树的结构,对所述抽象语义树中的指针和数组变量的声明、赋 值、访问以及标准库函数的节点进行关键词标记,并查找所述抽象语义树中与所述多种检 测模型中相匹配的节点以及分支;
[0019] 建立状态机,并分析内存访问操作和所述输入条件的迭代结果,判断当前的内存 访问操作是否在全量环境下有效。
[0020] 优选地,所述对所述控制流图和所述数据依赖图进行剪裁,包括:
[0021] 分析所述抽象语义树中被标记节点所在基本块对应于所述控制流图上的节点,删 除其余节点,重新建立节点之间的连接关系;
[0022] 保留所述控制流图中被保留下的节点以及内存访问操作的变量在所述数据依赖 图中的依赖关系,删除所述数据依赖图中的其余依赖关系。
[0023] 优选地,所述根据所述检测结果判断所述源代码中是否存在内存访问溢出,包 括:
[0024] 如果当前的内存访问操作在全量环境下有效,则判断不存在内存访问溢出,如果 当前的内存访问操作不是在全量环境下有效,则判断存在内存访问溢出。
[0025] 一种内存访问溢出的检测装置,包括:
[0026] 分析模块,用于对源代码进行预处理和词法分析、语法分析以及语义分析,生成控 制流图、数据依赖图以及抽象语义树;
[0027] 检测模块,用于针对不同的检测场景建立多种检测模型,并根据多种检测模型分 析所述控制流图、数据依赖图以及抽象语义树,进行表达式迭代以及状态空间遍历,输出检 测结果;
[0028] 输出模块,用于根据所述检测结果判断所述源代码中是否存在内存访问溢出,并 对检测出的内存访问溢出进行反馈输出。
[0029] 优选地,所述分析模块,包括:
[0030]分析单元,用于对所述源代码进行词法分析和语法分析,并基于词法分析和语法 分析的结果进行语义分析以及上下文分析,生成抽象语义树;
[0031] 切分单元,用于根据所述源代码的分支跳转和函数调用关系,将所述源代码切分 为多个基本块,并分析每个基本块之间的跳转关系,根据所述跳转关系生成控制流图;
[0032] 生成单元,用于分析所述源代码的变量之间的数据依赖关系,生成数据依赖图。
[0033] 优选地,所述检测模块,包括:
[0034] 定义单元,用于针对不同的检测场景定义多种检测模型,所述检测模型包括:指针 操作模型、数组访问模型、标准库函数模型和循环体与抽象迭代模型;
[0035] 裁剪单元,用于对所述控制流图和所述数据依赖图进行剪裁,沿所述控制流图和 所述数据依赖图中的路径将常量节点依次向后继节点传递,并计算常量表达式,通过操作 符连接并迭代内存访问操作的输入条件,进行表达式迭代并得到所述输入条件的迭代结 果;
[0036] 扫描单元,用于扫描所述抽象语义树的结构,对所述抽象语义树中的指针和数组 变量的声明、赋值、访问以及标准库函数的节点进行关键词标记,并查找所述抽象语义树中 与所述多种检测模型中相匹配的节点以及分支;
[0037] 判断单元,用于建立状态机,并分析内存访问操作和所述输入条件的迭代结果,判 断当前的内存访问操作是否在全量环境下有效。
[0038] 优选地,所述裁剪单元,包括:
[0039] 分析子单元,用于分析所述抽象语义树中被标记节点所在基本块对应于所述控制 流图上的节点,删除其余节点,重新建立节点之间的连接关系;
[0040] 保留子单元,用于保留所述控制流图中被保留下的节点以及内存访问操作的变量 在所述数据依赖图中的依赖关系,删除所述数据依赖
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1