内存错误检测技术理论与实践2002–03–24.docVIP

内存错误检测技术理论与实践2002–03–24.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存错误检测技术理论与实践2002–03–24

前言 Insure++能够检测众多不同类型的难以捉摸的错误,如内存破坏、内存泄露、内存分配错误、变量初始化错误、变量定义冲突、指针错误、库错误、逻辑错误和算法错误等等。 第一部分:列举了目前常见的错误检测技术。 第二部分:不同技术之间的比较,对错误检测效果的影响。应该看一下。 第三部分:为了展示问题的真实性,例举了一些代码实例(还可以找到更多例子),这些代码位于Insure++的安装目录下(D:\ParaSoft\Insure++\examples\c|cpp)。 错误检测技术分类 有若干种技术可以用于运行时错误检测。这些技术的主要途径是将已经写好的程序转换成一个新程序,其功能与原先的程序是等价的。新的程序包含有一些额外的代码,它们在程序执行期间检查错误。这种特殊技术被称为代码插装。按照代码插装或替换的时间不同,主要分为三类检测技术: . ECI:执行码替换(Executable Code Interception)并不对源码或目标码进行分析,而是在链接或执行时直接替换相应的系统调用(如malloc/free 等)。功能上有一定的局限性,这里不重点讨论。例如CodeTest就是采用这种技术。 . OCI:目标码插装(Object Code Insertion)直接对目标码进行分析,并插入相应的汇编代码;例如Purify和TestRT的PurifyLT就是采用这种技术。 . SCI:源码插装(Source Code Instrumentation)对源程序进行扫描分析,收集所有必要的检测信息,插入相应的检测代码(保存在临时文件中),并编译生成目标码供连接用;例如Insure++就是采用这种技术。 ECI-执行码替换技术 直接截取系统调用,迫使程序调用自己的函数。为了做到这一点,需要改变大量的系统调用名,或者替换系统调用。下面的例子很好地说明了这一过程: main() { char *ptr; ptr = malloc(4); } 加工后: main() { char *ptr; ptr = XX_malloc(4); } 变化在链接时实现,XX_malloc 将调用malloc 并执行检查。这种技术可以检测内存破坏、读未初始化内存等,但只能是动态内存,并出现在加工过的系统调用中。这种技术事实上也不能真正检测内存泄露。有时也采用“围墙”的方法检测内存破坏。在每个分配内存块的外围,设置一堵围墙(赋予特别值)。当代码掉入函数陷阱时(即改变过的系统调用), 检查围墙是否被重写过,是则报告一个错误。但它不能告知谁、何时破坏了围墙。 OCI-目标码插装技术 OCI 读入目标文件,并在汇编码一级对其进行插装。它也有自己的内存分配和释放函数库,并用它截取系统的相应调用。OCI 只能检测动态内存的破坏问题,它所使用的技术与ECI 类似,为每个内存块建一堵“围墙”。如果在执行中程序试图写入围墙地址,就报告错误。这也意味着OCI 不能检测到“跳墙”事件,因此并不能检测到所有内存破坏错误。 为了检测未初始化内存的读操作,OCI 使用了“着色”技术,在程序的开始,假设所有的内存未初始化。当程序执行时,记录每次写操作及其内存位置,并标记为已初始化。问题是OCI 技术没有理解其操作的数据结构,因此也无法知道读写操作是否具有正确的类型和形式,只能看到发生在不允许的内存地址。这样的检查是相当虚弱的。 SCI-源码插装技术 SCI 技术对源码进行扫描和分析,对每个指针操作、内存读写和许多其它操作进行加工处理,它比其它技术更完整地理解程序的行为。SCI 更高的准确性和精确性就是其直接结果。在加工和执行过程中,SCI 建立了一个数据库,包含每个动态、静态、栈和共享内存块的信息,SCI 还有一个程序中使用的指针数据库,对每次内存和指针操作进行准确跟踪。因此没有“跳墙”的可能。读取未初始化内存的检查也是一样,每次分配内存块时先登记为位初始化,然后在读操作时检查其标记即可。 SCI 成功的关键是其源码分析和插装能力。这样它就能检查每次读写操作,并积累关于指针和内存块使用的知识,这些知识保证了SCI 跟踪内存状态的精确性。这一点对于检测内存泄露特别关键。由于SCI 监视所有的指针和内存块,因此它能检测最新的指针和内存问题。这就是SCI 能实时报告内存泄露的原因,这绝对是它独有的。 Insure++拥有SCI 技术专利,还拥有ECI 技术。 检测能力比较 ECI 和OCI 只能检测动态内存破坏,它们不能检测静态内存和堆栈的问题,因为“围墙”技术只能适用于动态内存。这是一个很大的缺陷。SCI 能够检测所有内存区,因为其一,SCI 工作在源码级,在源码级对所有内存区的破坏跟踪相对较为容易;其二,SCI 数据库将每一个指针都映射到内存块,能够准确检测内存是否发生写入问题。 另一个主要

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档