(计算机软件与理论专业论文)cc程序资源泄漏的静态检查研究.pdf_第1页
(计算机软件与理论专业论文)cc程序资源泄漏的静态检查研究.pdf_第2页
(计算机软件与理论专业论文)cc程序资源泄漏的静态检查研究.pdf_第3页
(计算机软件与理论专业论文)cc程序资源泄漏的静态检查研究.pdf_第4页
(计算机软件与理论专业论文)cc程序资源泄漏的静态检查研究.pdf_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 本文针对c c + + 程序中资源泄漏安全漏洞的静态检查进行了研究。为了达到 查找c c + + 程序中的安全漏洞,提高软件安全性的目的,本文设计并实现了一种 静态检查资源泄漏的方法。该方法以g c c 编译器完成语法分析后得到的中间表示 为分析对象,通过记录资源的申请与释放,结合安全规则实现安全检查。 首先,对资源泄漏的表现进行分类,并采用语法制导翻译的方法构建安全规 则。其次,设计出指针节点和资源节点,记录资源的使用情况:针对分支语句, 使用一种流敏感的分析方法,模拟程序的动态执行;采用自下而上分析实现了跨 过程检查。最后,结合抽象语法树的具体节点给出了安全检查的算法,完成了静 态检查工具的实现。本文的检查方案实现在c c + + 静态检查工具x d c h e c k 中, 实验证明该方法是有效的。 关键词:资源泄漏 静态检查安全漏洞 安全模式 a b s t r a c t s t a t i c a l l yd e t e c tr e s o u r c el e a ki nc ,c hp r o g r a mi ss t u d i e di nt h i sp a p e r i no r d e r t of r e do u ts a f e t yf l a w si nc ,c hp r o g r a ma n di m p r o v et h es a f e t yp e r f o r m a n c eo f s o f t w a r e ,am e t h o dt os t a t i c a l l yd e t e c tr e s o u r c el e a ki sd e s i g n e da n di m p l e m e n t e d b a s e do na n a l y z i n gi n t e r m e d i a t er e p r e s e n t a t i o nf i l e sg e n e r a t e db yg c cc o m p i l e ra f t e r s e m a n t i c 锄a l y z e r a c c o r d i n gt ot h es a f e t yr u l e sb yr e c o r dt h er e s o u r c ea p p l i c a t i o na n d r e l e a s e ,r e s o u r c el e a kv u l n e r a b i l i t i e sa r ed e t e c t e d f i r s t , t h er e p r e s e n t a t i o n so fr e s o m c el e a k t i t l ec l a s s i f i e d t h es y n t a xd i r e c t e d t r a n s l a t i o nm e t h o di s a d o p t e dt o c o n s t r u c ts a f e t yr u l e s s e c o n d ,p o i n t e rn o d ea n d r e s o u r c en o d ei sd e s i g n e dt or e c o r dt h eu s a g eo fr e s o u r c e f l o w - s e n s i t i v ea n a l y s i si s u s e dt ot r e a tw i t hc o n d i t i o n a ls t a t e m e n t s ,w i t hw h i c ht h ed y n a m i ce x e c n t i o no f p r o g r a m i ss i m u l a t e d n i eb o t t o mu pa n a l y s i si sa d o p t e db yi n t e r p r o c e d u r a lc h e c k f i n a l l y , c o m b i n e dw i t hs p e c i f i cn o d e so fa b s t r a c ts y n t a xt r e e ,s a f e t ya n a l y s i sa l g o r i t h m sa r e d e s c r i b e da n dt h es t a t i c a l l yd e t e c t i o nt o o li si m p l e m e n t e d t h em e t h o dp r o p o s e di nt h i s p a p e rw a si m p l e m e n t e di nx d c h e c k ,as t a t i c a l l yc h e c k i n gt o o lf o rc c + + p r o g r a m , e x p e r i m e n t a lr e s u l t si l l u s t r a t et h a tt h i sm e t h o di se f f e c t i v e k e y w o r d :r e s o u r c el e a k s t a t i cc h e c k i n g s a f e t yf l a w s s a f e t yp a t t e r n 创新性声明 本人声明所呈交的论文是我个人在导师的指导下进行的研究工作及取得的研 究成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中 不包含其他人已经发表或撰写过的研究成果,也不包含为获得西安电子科技大学 或其他教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究工 作所做的任何贡献均己在论文中作了明确的说明并表示了谢意。 申请学位论文若有不实之处,本人承担一切相关责任。 本人签名:与堑垃 日期: 关于论文使用授权的说明 本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究 生在校攻读学位期间论文工作的知识产权单位属西安电子科技大学。本人保证毕 业离校后,发表论文或使用论文工作成果时署名单位仍然为西安电子科技大学。 学校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公向论文的全 部或部分内容,可以允许采用影印、缩印或其他复制手段保存论文。( 保密的论文 在解密后遵守此规定) 本学位论文属于保密在年解密后适用本授权书。 本人签名:当! 工垒1 导师签名:丝 】 日期:! ! ! ! :! :1 3 日期: 柳i ? 第一章绪论 第一章绪论 1 1 研究背景 本文的工作源于“十五”预研课题“软件安全性故障模式分析”。该课题重 点解决c c + + 语言本身的安全问题,最终提供一组与安全分析相关的方法,并研 截出一个基于静态分析的软件系统安全检查工具x d c h e c k 。 近年来,软件安全,特别是军事、航空、航天领域的软件安全已越来越受到 人们的重视。大量存在于软件系统中的安全隐患,使得软件在使用阶段产生意想 不到的错误,从而造成重大损失。这其中由于程序设计语言本身的缺陷,使得软 件安全性降低,是导致软件安全问题的一个重要原因。 d c + + 语言是耳翦广泛应用的程序设计语言,大量的软件都是使用c c + + 语言 设计实现的。a c 抖语言有许多优点,如:语言简洁、使用方便灵活、可移植性好、 硬件控制能力高、以及表达和运算能力强等等。但灵活性的提高往往带来一些限 制的减少,导致了软件安全性的降低。 c ,c + + 语言可能带来的安全隐患越来越受到关注。如:对数组下标越界不作检 查,会导致数组和指针的越界:对变量的类型检查不够严格,允许隐式的类型转 换,会导致运行结果错误等。安全隐患除了与语言特侄相关的部分,还包括一些 普遍的问题,如:在允许使用指针动态申请空间的语言中都存在的内存泄漏、野 指针等。c + + 语言还存在一些与面相对象机制相关的问题,如:对象的构造与析构, 虚函数的重置,以及成员函数的隐藏等都很容易导致资源泄漏及数据流方面的安 全问题。 对于自主开发的软件,主要通过测试的方法检查历有可能的不安全因素。这 需要对软件的功能、特性等具有深刻了解,并且根据软件特性设计完备的测试集, 但这种方法需要消耗大量的人力和物力。因此,如何能在程序静态不运行时自动 检测出软件源程序中存在的一些安全性问题,避免不必要的损失,成为当前计算 机安全领域中需要研究的一个重要课题。 针对软件安全性这一重要问题,国内外许多学者提出了不同的解决方式,如 代码验证( c o d e i d a t i o n ) 、程序分析( p r o g r a m 删y s i s ) 、模型检查( m o d c l c h e w i n g ) 、进化测试( e v o l u t i o n a r y 融i n g ) 等。其中,基于程序分析的安全性检 查的方法包括基于词法分析【l l 、语法和简单语义分析【2 1 、以及基于规则【3 】等的安全 检查方法。本课题在分析比较的基础上采取了基于程序分析的安全性检查的方法, c ,c + + 程序资源泄漏的静态榆查研究 对c ,c + + 程序中的各种安全隐患进行静态检查。 本课题所研究的一组方法,可以被广泛地应用于军事应用领域中的软件分析, 以提高军事应用软件的安全性;而且具有一定的普遍性,对其他相关工作,如逆 向工程、遗产继承等均具有理论和实际指导意义。 1 2 资源泄漏检查的研究现状 目前人们在c c + + 的静态安全检查领域进行了大量的研究,针对资源泄漏尤 其是内存泄漏这一安全问题,已经实现了多种检查工具。对于不同的安全检查工 具,其采取的安全检查方法也不同,下面对主流的几种检查工具及其检查方法加 以简单介绍。 通过要求程序员手工加入注释来完成安全检查的代表是s p l i m 4 和p c i i n t t ”。 其中,s p l i n t 只专注于c 语言安全检查,p c i i n t 增加了完善的对c + + 安全检查的支 持,可以覆盖更多的c c + + 安全漏洞。对于此类工具,安全检查的正确性与程序 中所加的注释的工作量有关,并且检查结果中存在着比较多的错误报告【6 】。 p r e f i x l 7 1 是一个自动化的静态安全检查工具,不需要程序员的手工干预。其使 用前置条件和后置条件的概念定义c c + + 程序中各种语句的安全性条件,并利用 该条件执行语法安全检查。由于该工具没有进行全局的指针别名分析,所以对于 使用了容器类型的数据结构存储指针变量的情况无法有效分析。因此种情况引发 的资源泄漏情况在实际检查中经常无法发现。 d a v i dl h e i n e 提出了通过建立类型系统 s l ,采用所有权模型( o w n e r s h i p m o d e l ) 来管理内存资源的方法,以此检查内存泄漏。该方法的实现比较复杂, 但检查准确度较高。 本课题组的往届成员廉婷丽 9 1 提出了一种通过使用指针链表和内存链表,静态 模拟程序的动态执行,检查与动态存储相关的安全漏洞的方法。该方法对过程内 的一重指针,在不含分支循环语句的情况下可以进行与动态存储相关的安全漏洞 检查。本文在此基础上,重点解决了分支、循环语句、结构体、多重指针、跨过 程等情况下的资源泄漏检查。 括: 1 3 论文的主要工作与组织结构 本文所作的工作是课题“软件系统安全分析”中的一部分,主要研究内容包 第一章绪论 1 对分支,循环语句的资源泄漏检查; 2 对结构体变量、多重指针资源泄漏的检查; 3 对全局变量资源泄漏的检查: 4 。对跨过程资源泄漏检查的实现。 首先,对资源泄漏的表现进行分类,并采用产生式和语义规则的形式,对资 源泄漏进行形式化描述的安全模式分析,构建安全规则; 其次,设计出指针节点和资源节点,记录资源的使用情况;针对分支语句, 使用一种流敏感的分析方法,模拟程序的动态执行;采用自下而上分析实现了跨 过程检查; 最后,结合抽象语法树的具体节点给出了安全检查的算法,完成了静态检查 工具的实现。本文的检查方案实现在c c 抖静态检查工具x d c h e c k 中,实验证 明该方法是有效的。 本文组织结构为:第一章为绪论部分,主要介绍项目背景、当前的研究现状 以及本人的主要工作;第二章是系统总体概述,介绍了系统的设计思想、安全检 查工具的总体框架;第三章为资源泄漏检查的分析与设计,分三部分论述,分别 为:资源泄漏的表现及产生原因分析、过程内资源泄漏检查的分析与设计和跨过 程资源泄漏检查的分析与设计;第四章主要介绍资源泄漏检查的实现;最后对本 文进行概括和总结。 第二章系统总体概述 2 1 系统的设计思想 2 2 1 基于g c c 中间表示的分析 x d c h e c k 所完成的静态检查是程序通过语法分析之后的语义阶段的检查。 为了避开语法有关的问题,x d c 髓c k 选择基于编译器完成语法分析后得到的中 问表示进行分析。x d c h e c k 以l i n u x 环境下开放性编译器g c c 前端生成的中间 表示a s t i i o j ( a b s t r a c ts y n t a xt r e e ,抽象语法树) 为基础进行分析。 以抽象语法树为分析基础的原因是:抽象语法树作为g c c 中间表示的一个 抽象层次,可以较好的表示各种语言的语法特征,对抽象语法树的遍历过程相当 于源程序的语法分析过程,遍历过程中对特定树节点的处理操作相当于语法分析 过程中的语义动作,保留了源程序所有的完整信息,可以提取符号信息,实现对 语言特性的处理;有抽象语法树遍历工具g a s t a i u 2 的支持,提供遍历抽象语法 树的框架和操作接口,采用模块化的结构,可以在原有框架的基础上增加新的模 块,同时将新的接口加入到原框架中。 2 2 2 自下而上分析 传统的跨过程分析是首先通过构造控制流图、数据流图得到程序的控制依赖 和数据依赖图,然后在此基础上构造出系统依赖图( s y s t e md e p e n d e n c eg r a p h , s d g ) 。系统依赖图中记录了所有的函数调用层次和数据依赖关系。随着程序结构 复杂度和规模的增大,系统依赖图的复杂度和规模会相应增大,导致程序分析的 效率下降。 x d c h e c k 采用了一种基于函数依赖关系的自下而上分析方法,其思想是: 首先根据函数调用关系构造函数依赖图,通过断边解环,得到一个有向无环图。 对此图进行拓扑排序,所确定的函数分析次穿可以保证对任意函数a 和b ,若a 调用了b ,则b 必定先于a 被分析。按此次序依次对每个函数进行分析并记录分 析结果,则在分析函数调用语句时,不需要再次展开被调用函数的函数体进行分 析,直接使用分析结果即可,从而将跨过程程序分析转变为过程内程序分析。这 种分析方法保证即使每个函数被多次调用,函数体本身也只需分析一遍,提高了 整个分析过程的效率。 6 c c h 资源泄漏静态检查研究 2 2 安全分析检查器的总体框架 所图2 1 所示,x d c h e c k 被设计为两个部分,即一个前端程序和一个后端程 序。前端程序负责向程序员提供一个命令行界面,并从程序员提供的命令行输入 中获得项目的源代码文件列表。当获得源代码文件列表之后,x d c h e c k 觚端程 序将调用g c c 编译器对给定的源代码文件进行编泽,并获取其中间语法表示结构。 最后,x d c h e c k 前瑞将中间语法树文件列表直接提交给x d c h e c k 后端。 图2 1x d c h e c k 程序框架结构 后端程序负责实际的安全检查,主要分为如下五个模块: ( 1 ) 契约分析模块:该模块负责从配置文件中读取程序的安全模式描述,并根 据该描述构造安全模式的内部表示。 ( 2 ) 符号表提取模块:该模块负责遍历所有的程序中间表示,从中抽取程序中 的各种符号的信息,包括类型系统、和函数记录。同时该模块也负责根据 得到的类型构造变量信息记录生成器,该生成器可以用于在后续的安全检 查过程中构造变量记录节点。 ( 3 ) 函数调用关系分析模块:该模块负责分析并处理整个项目中所有函数的调 用依赖关系,并根据该依赖关系确定后续安全检查过程中各个函数的分析 顺序。 ( 4 ) 主安全检查模块:该模块负责遍历每一个中间语法树,并在遍历过程中执 行安全检查。该模块是x d c h e c k 安全检查功能的主要实现部分,其内部 包含七个子模块,分别对各类程序安全漏洞执行安全检查。 ( 5 ) 错误报告模块:该模块负责接收安全检查器分析过程中得到的错误信息, 并根据程序员制定的格式将错误信息整理为错误报告并输出。 第三章资源泄漏检查的分析与设计 资源泄漏检查可分为过程内和跨过程两个部分。过程内检查是跨过程检查的 基础;同时,跨过程检查又为过程内检查提供了必要的信息,使得过程内检查更 加准确。本章首先对资源泄漏的表现及其产生原因进行分析,然后分别给出了过 程内和跨过程检查的分析与设计。 3 1 资源泄漏的表现及产生原因分析 资源泄漏包括内存、文件指针、s o c k e t 等资源的泄漏。其中,内存泄漏最为常 见,如用m a l l o c 申请的内存资源,没有用f r e e 函数释放。文件指针也是个常用 的资源,使用f o p e n 获得的了文件指针这种资源,在使用完后需要使用f c l o s e 释放 该资源。由于资源泄漏使得软件安全性降低弓i 起的后果是不容忽视的,最终可能 导致系统资源耗尽引起系统崩溃。 3 1 1 资源泄漏的表现与分类 资源泄漏的主要表现形式如下: 申请单个内存资源、文件指针、s o c k e t 等资源而没有释放; 申请数组资源而没有释放; 结构体的成员申请资源而没有释放; 类的构造函数中申请了资源,而析构函数中没有释放资源造成的资源 泄漏; 控制流分支引起的资源泄漏问题; 没有释放资源就重新赋值带来的泄漏【1 9 1 ; 由于资源释放的顺序不正确导致的地址信息丢失而带来的泄漏问题; 申请的空间没有有效地传给指针的问题1 2 0 l ; 使用错误的释放函数释放资源的问题; 重复释放资源: 释放未申请的资源; 其中、是典型的申请资源而没有释放的情况;问题和的特点是成员 所申请的资源没有释放,造成资源泄漏;问题可能有多种形式,如在主干语句 中申请了资源而在分支语句中释放,或者反之等等;问题的本质表现如图3 。1 c c 资源泄漏静态榆壹研究 所示;问题的特点是某个指针结构中含有其它指针的信息,如二重指针或者结 构体的成员指针等情况( 如图3 2 所示) ,此时要求先释放成员的资源,然后释放 其本身申请的资源,当释放顺序错误时,会引起资源泄漏;是跨过程函数调用 的参数传递方式不正确所引起的问题( 如图3 3 ) ;是释放资源的函数与申请资 源的函数不匹配,资源没有被正确释放,导致泄漏。 p o i n t e r _ l p o i n t e r 2 图3 i 问题中的资源泄漏情况示例 o t h e rm e m b e r s p o i i l t c rm e m b e r 卜叫m e m b e r d a t a 图3 2 问题中指针结构示例 o lv o i dg e t m e m o r y ( c h a r + p 。i n tn l l m )严由f c 语言使用的是值传递的参数调用方 式,所以p 对应的实参无法通过函数调用获 得函数体中申请的资源。该资源在调用时会 泄漏+ , 0 2 0 3 p = ( c h a r + ) m a l l o c ( s i z e o f ( c h a r ) h u m ) , 0 4 l 0 5 0 6v o i dm a i n 0 0 7 0 8 c h a r + s i t = n u l l ; 0 9 g e t m e m o r y ( s t r , l o ) ;* s t r 并没有获得资源 1 0 s t r c p y ( s t r , ”h e l l o ”) ; ,错误写入数据 ii p r i n t f ( ”s i i ” s t r ) ; 1 2 f r e e ( s t r ) ; ,+ s 仃没有申请资源却释放 1 3 , 图3 3 参数不正确的传递方式实例 按照资源泄漏的表现可以分为两大类: 1 申请资源没有释放; 2 申请与释放不一致。 对于申请与释放不一致又可进一步分为: a 申请与释放的资源类型不一致。譬如,用n e w 】申请的资源使用 d e l e t e 释放或者用n e w 申请的资源使用f r e e 释放等等; b 申请与释放的顺序不一致。包括:重复释放资源,释放未申请的资 源等。 申请资源没有释放的主要表现形式为上述到;到是申请与释放不一 致的主要表现形式。 3 1 2 资源泄漏的产生原因分析 根据资源泄漏的表现可以发现资源泄漏的实质是未正确使用负责资源创建和 资源释放操作的资源控制函数。通常对一类资源的操作都由一个或一组函数负责 申请资源,另外一个函数或一组函数负责释放资源。c c + + 的语义要求,当使用了 资源创建函数申请了资源且当资源使用完毕后必须用正确的资源释放函数进行资 源的释放。这种配对使用函数的方式大量存在于各种资源控制函数中。常用的资 源控制配对函数如下表所示。 资源创建函数资源释放函数 m a l l o cf r e e c a l l o cf r e e s t r d u p f r e e r e a u o cf r e e n e wd e l e t e n e w d e l e t e 】 f o p e n f c l o s e s o c k e tc l o s e 表3 ic ,c + + 标准库中常用的资源控制配对函数 3 2 过程内资源泄漏检查的分析与设计 过程内资源泄漏检查只关心单个过程内部的资源泄漏情况,是跨过程分析检 查的基础。在本节中,首先给出了过程内资源泄漏检查的关注点:然后,通过对 过程内资源泄漏检查的安全模式分析导出过程内资源泄漏检查的核心数据结构的 设计,在此基础上建立了过程内资源泄漏检查的核心算法。 3 2 1 过程内资源泄漏检查的关注点 过程内资源泄漏检查关键是根据函数配对关系,在遍历抽象语法树的过程中, c ,c + + 资源泄漏静态检查研究 记录资源的申请弓释放情况,从而实现资源泄漏的检查。过程内资源泄漏检查的 主要关注点是: 1 指针变量、结构体变量、一些容器类型的数据结构; 2 申请的资源的方式; 3 释放资源时的方式: 4 变量发生赋值时: 5 每个变量的生存周期。 在c ,c + + 程序中,资源的使用都是通过指针完成的,所以在检查资源泄漏时 对于所有的指针变量都需要进行详细的跟踪记录。对于含有指针结构的结构体变 量、容器类型的数据结构,因为其本身也可以通过内部数据成员申请资源,在检 查时同样需要认真考虑。当一个变量申请资源的时候,需要记录该资源的申请方 式。记录了资源的申请方式后,当释放此资源时,才能检查出是否使用了正确的 资源释放函数释放了资源。变量发生赋值时,需检查是否有资源泄漏发生。每个 变量都有自己的生存期,针对泄漏发生在生存期结束时这种情况,需要记录每个 变量的生存期,以进行有效检查。 3 2 2 过程内资源泄漏检查的安全模式分析 安全模式是对安全漏洞的形式化描述。构建安全模式的目的是通过对安全漏 洞进行形式化的描述从而检测出一类安全漏洞。本文主要是采用静态语义的方式, 在a s t 中,对所关注的节点,也就是可能出现安全漏洞的节点,根据需要添加属 性,通过制定语法制导翻译方案,设计语义规则,在遍历抽象语法树的过程中实 现对属性的记录以及计算,实现对资源泄漏安全漏洞的检查。 3 2 2 1 属性的设计 资源泄漏检查需要记录每次申请的资源,所以设计资源节点r e $ n o d e 表示申 请的一个资源。对于一个具体的资源,需要记录该资源的类型r e st y p e ,根据此类 型判断是否使用了相匹配的函数释放资源;同时,还需要记录该资源所在的行号, 以便报错时用。为了区分不同的资源使用r i d 表示资源的标号。 对于指针变量,设计指针节点p o i n t e rn o d e 记录该指针变量的信息。r e $ s e t 用来表示一个指针节点申请的资源的集合。n or e s o u r c e 表示该指针没有申请 资源。 3 2 2 2 安全漏洞的形式化描述 通过设计语义规则,制定语法制导翻译方案,完成对安全漏洞的形式化描述。 下面分别对几个关键产生式描述。 1 ) 申请资源 e a l l _ e x p r _ c r i d _ n o d e ( a r g _ l i s t ) 一产生式3 1 i f i d _ n o d e n a i l l e n e w _ r e s o u r c e _ s e t t h e nb e g i n r e s _ n o d e :2c r e a t e _ r e s o u r c e _ n o d e ( i d _ _ n o d e n a l n e ) c a l le x p r _ c r r i d := r e s _ n o d e r i d c a l l _ _ e x p re r r e s _ t y p e :2r e s _ n o d e r e st y p e s t o r er e sn o d e ( r e s _ n o d e ) e n d ) 上面给出了申请资源时的语法制导翻译方案。其中,n e w r e s o u r c e s e t 表示的是所有可以创建资源的函数的集合。函数c r e a t e r e s o u r c e n o d e 负责生成一 个新的用来记录资源使用情况的资源节点r e s _ _ n o d e ,函数s t o r e r e s n o d e 负责将生 成的资源节点存储起来,以便下次使用。 r 2 ) 释放资源 e a l l _ e x p r _ d e l i d _ n o d e ( a r g _ f i s t ) 一产生式3 2 i f i d _ n o d e n a n l e d e l e t e _ r e s o u r c es e t t h e nb e g i n f u n c j n f o n o d e := l o o k - n p _ f u n ci n f o ( i d _ n o d e n a m e ) i f a r gl i s t r i d 属性s t a t u s 的内容可以为b e g i n 或者e n d ,分别表示作用域的开始与结束。 属性p t r s 指的是一个作用域中定义的所有可以申请资源的变量。当个作用域结 束的时候,定义在这个在作用域中所有的指针变量的生存期都将结束,此时,函 数c h e e k _ s c o p e _ r e s _ l e a k 负责检查这些指针变量是否有资源泄漏发生。 3 2 3 核心数据结构的设计 在形式化描述安全漏洞的基础上,如果要实现资源泄漏检查,还需要相应的 数据结构实现属性。而有了安全模式分析,对数据结构的设计具有非常强的指导 性。本节给出了资源泄漏检查的实现中最核心的一些数据结构的设计。在这些数 据结构的设计时使用了g l i b l 2 2 】库中的一些数据结构,如线性单链表g s l i s t 、字符 串g s t r i n g 和哈希表g h a s h t a b l e 。g l i b 库是l i n u x 平台下最常用的c 语言函数库, 它具有很好的可移植性和实用性,并且提供了创建和操作常用数据结构的实用函 数,使用g l i b 库可以大幅提高程序设计的质量,同时带来了很大的方便,可以更 好的关注于问题的解决。 1 ) 资源节点 资源节点的数据结构如下所示: t y p e d e f s t r u c t i n tr i d ; 芦每个资源的标识号,唯- - , r e s o u r c e t y p et y p e ; 资源的类型+ , i n tl i n eh u m ;,资源所在的行号, g s “s t * o w n e rl i s t ; 产资源拥有者链表+ ) r e s o u r c e n o d e ; r i d 是每个资源节点的标识号,在具体实现的时候是一个大于零的整型数。 r e s o u r c e t y p e 描述的是该资源的类型,这是一个枚举量,其定义如下: t y p e d e f e n u mr e s o u r c e t y p e m a l l o c , * m a l l o c ,e a l l o e ,s t r d u p 等函数申请的资源+ n e w , n e w _ b r a c k e t s ,* n e w 】申请的资源+ f i l e p o i n t e r ,产文件指针资源,由f o p e n 函数创建+ o s t r i n o o g s t r i n g 函数创建的资源+ , g s l i s t * g s l i s t 函数创建的资源+ g h a s h t a b l e严g h a s h t a b l e 函数创建的资源。, ) r e s o u r e e t y p e ; l i n en u m 指的是该资源所在的行号,该值主要是当检查发现问题时用来定位错误 所在的位置。o w n e rl i s t 中存放的是指针节点p o i n t e r n o d e ,也就是所有指向该资源 的指针节点。 2 ) 指针节点 指针节点的数据结构如下所示: t y p e d e f s t r u c t o s t r i n g * n a m e ; 芦变量名称, g s t r i n g + m a n g l e d _ n a m e ;改造后的名称,唯一+ , i n tl i n en o ; ,变量所在行号+ i n ti sp a r a m ;,幸参数位置+ g s l i s t + p t r _ r i d _ l i s t ; 申请的资源节点的标号+ c ,c + + 资源泄漏静态检查研究 p o i n t e r n o d e ; 其中,n a m e 是指针变量的实际名称;m a n g l e dn a l t l e 是改造后的变量名称,用 以唯一标识变量,避免不同作用域的变量重名问题,改造方法为在变量名称后加 上文件名和行号,中间以冒号隔开:f i n en o 记录变量所在的行号;i sp a r 越:a 用来 表示该变量是第几个参数,如果不是参数,则置为0 ,否则其值表示该参赛在参数 列表中的位置;p 仃r i dl i s t 中存放的是该指针节点当前可能申请的资源节点的标 号,通过此标号即可以查找到申请的资源的信息。此处值得注意的是采用了一个 链表存储可能申请到的资源节点的标号,是因为当前指针变量申请到的资源不是 唯一可确定的,即因为分支语句、循环语句的存在,只能确定出指针变量可能申 请了那些资源,是一个集合,所以采用了链表存储。对于一个指针节点所具体指 向的资源节点标号r i d ,其值表示的意义如下: r i d 0 ,表示该r i d 是一个动态申请的资源节点的标号: r i d = 0 ,表示该指针没有申请任何资源; r i d = 1 ,表示该指针是一个空指针( n u l l p o i n t e r ) : r i d = 2 ,表示该指针申请的资源已经释放; r i d = 3 ,表示该指针申请资源的情况未知,此种情况出现在一些从容器型数 据结构中取出的指针节点,当时其是否申请资源无法准确判定。通常,使用指针 节点来记录指针变量的信息。实际实现中,在增加了一部分数据成员后,指针节 点也可以用来记录结构体变量的信息。 3 ) 资源节点哈希表和作用域指针链表 通过指针节点和资源节点可以在遍历抽象语法树的时候提取安全检查所需要 的信息。在实际实现的时候,指针节点是通过指针链表、资源节点是通过资源节 点哈希表组织起来的。 资源节点哈希表的定义如下: g h 觞h 1 a b l rl o c a lr e st a b l e ; g h a s h t a b l e + g l o b a l _ r e s _ t a b l e ; 其中,l o c a l r e s t a b l e 中存储的是局部变量申请的资源的记录,g l o b a lr e st a b l e 中存储的是全局变量申请的资源的记录。在资源节点哈希表中,资源节点杯识符 r i d 是关键字,资源节点是对应的值,通过唯一的r i d 即可在资源节点哈希表中检 索到资源节点信息。 因为指针变量是有生存期的,所以在存储指针节点时是按照作用域存储的, 即每个作用域都有两条指针链表,一条记录在当前作用域中定义的指针变量,一 条记录在当前作用域中指针所申请的资源发生了改变的指针节点。当前作用域中 苎三皇窒塑堂塑丝查笪坌堑兰丝生 1 2 定义的指针链表的定义如下: g s l i s t * c u r r e n ts c o p e 记录当前作用域中定义的指针节点+_pointers; i n tn u m b e r _ _ o f _ p o i n t e r s 1 0 0 】= o ) ; 当前作用域中定义的指针节点的个数用n u m b e ro fp o i n t e r s 表示,数组的序号代表 作用域的深度。当作用域结束时,定义在当前作用域中的指针其生存期都将结束, 此时需要检查这些指针节点所申请的资源是否有泄漏发生。 3 2 4 指针别名的处理 当程序里面有指针数据类型或者有通过传地址方式进行的过程调用时,两个 或两个以上的表达式就可能代表同一内存地址,这时,我们称这些代表同一内存地 址的表达式互为别名口j 。由于指针数据类型的存在而引起的别名称为指针别名, 指针别名是c 语言的典型特征之一。c + + 语言包含c 语言的这一特征,同时还提 供引用机制,从而使得别名具有更多的形式,增加了指针别名分析的难度。 根据分析过程中是否考虑程序中语句的顺序和控制流信息,指针别名分析可 分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论