论文部分内容阅读
软件是信息系统的灵魂,而软件缺陷的存在严重影响了信息系统的可靠性和安全性,成为了信息系统稳定运行的重大隐患。固本清源,研究面向缺陷的软件可靠性及安全性增强方法,不仅能够降低信息系统发生故障的概率,更能够将信息安全从事后响应及修复向事前防御和安全确保推进。在诸多的软件缺陷中,软件编码过程中由于程序员的逻辑、设计不严谨、甚至是笔误等引入的程序错误是软件缺陷的主要组成部分。软件测试是检测及修正软件错误的重要手段及方法,然而,软件测试的作用仅局限在检测错误,基于测试的软件调试,包括错误定位、错误诊断及修复,是最为复杂和繁琐的工作。同时,程序结构的复杂性也加剧了软件错误修复不准确、不彻底等问题。因此,软件调试具有很高的自动化和精确性需求。本文认为,软件行为的不可知与不可控是软件调试困难的主要原因。软件错误的触发、感染链的传递与失效与执行上下文的动态变化息息相关,而执行上下文则可以从侧面反应软件的执行过程和行为变化,是解决软件调试复杂且易出错等问题的重要思路。基于此,本文的主要研究工作包括如下几个方面:1.针对测试用例的相似性会影响错误定位的准确性这一问题,本文提出执行差异化的错误定位方法PAFL,旨在利用执行过程分析以提高错误定位的准确性,降低测试用例相似性对代码覆盖率计算的影响。该方法首先分析程序在不同测试输入下的执行轨迹,以覆盖向量来组织执行的覆盖信息;随后再根据覆盖向量路径的不同用例的执行结果计算覆盖向量的错误可疑度;在计算出每条覆盖向量的错误可疑度之后,针对不同的代码语句,依据覆盖该代码语句的不同覆盖向量的错误可疑度以及失效在不同覆盖向量上的分布情况,计算代码语句的错误可疑度;最后分别依据执行路径的可疑度和代码的错误可疑度,对代码语句进行分组和降序。2.针对目前的基于覆盖率的错误定位方法中软件状态高度简化、粒度过大等问题,本文提出了基于切片的统计式错误定位方法。该方法首先利用程序输出的结构化信息细化程序的失效状态,随后借助于程序切片技术,动态分析直接或间接控制和数据支配程序失效的中间状态,切割出与失效存在依赖关系的代码片段,提高错误定位的精确性。3.以软件错误与运行态软件失效之间的关联分析为目标,本文首先指出基于覆盖率的错误定位方法中所得的错误可疑度与错误代码之间并不存在直接的因果关系,不能将错误可疑度直接作为判定代码出错与否的依据。考虑程序的失效过程,具有较高错误可疑度的高可疑代码是程序失效的重要特征,是错误定位的重要线索,同时高可疑代码与错误代码之间存在强关联性,这种关联性是提高错误定位的重要因素。为了挖掘这种关联性,本文基于覆盖向量建立执行轨迹分析及频繁集求解模型。该模型以高可疑代码为目标,通过在失效执行轨迹上的频繁集求解来挖掘该高可疑代码的关联代码,并以挖掘出的关联代码作为代码检查的对象。4.在目前的错误定位评估指标中,错误定位的结果应用太过理想化、与实际的调试过程脱节。针对此问题,本文探索了软件错误定位的应用方法,以错误定位结果为导向,结合程序的执行上下文,设计了一种用于差分式动态调试的测试用例选择与组合方法。该方法不同于回归测试等研究中的测试用例选择与优化,重点解决软件调试过程中针对错误的触发、理解及根源分析问题。5.作为一种特殊的软件错误,软件漏洞是众多安全事件的根源。然而,由于软件漏洞执行的隐蔽性,软件漏洞的调试异常困难,且会因源代码的不可取而变得难上加难。本文提出基于结构化污点的漏洞调试方法,该方法能够在二进制代码层次上定位内存数据损坏的触发点以及相应的执行上下文环境。基于结构化污点的漏洞调试方法基于以下两个发现:(1)程序的输入一般含有结构化的信息,即程序输入可分割为多个数据域,且每个数据域具有独立的语义;(2)导致内存数据损坏的异常输入违反的程序语义。综合这两个发现可以得知,内存数据的损坏会使得数据域的某个部分被非预期的指令访问,破坏了数据域的语义独立性。据此,本文提出的基于结构化污点分析方法通过动态数据域捕获、模式异常检测等手段检测数据流的分歧,随后回溯追踪造成数据域分歧的执行上下文和相关指令。