论文部分内容阅读
软件缺陷检测是计算机科学特别是软件工程相关领域的重要研究工作之一。对于静态检测方法而言,如何在保障准确性的同时改善可扩展性一直以来都是研究的热点问题。本文设计并实现了一个基于传播引擎的高效、精确的缺陷检测框架Minerva,通过对具有不同软件缺陷特征的代码段运用合适开销的缺陷检测方法,在保障准确性的同时改善了可扩展性。 本文的主要贡献如下: 1、提出场景敏感的缺陷检测方法。将程序中所有的潜在错误语句按不同的错误触发状态进行划分,针对不同的错误触发状态,应用不同开销的缺陷检测方法实施检测。 a)提出场景敏感的缺陷检测思想,将不同的错误触发场景作为考虑因素加入到静态缺陷检测方法中。 b)提出在一个程序中应用不同开销不同准确性的缺陷检测方法,例如将路径不敏感分析检测与路径敏感分析检测相结合,以极大化各方法的收益,进而实现在保障准确性的同时改善可扩展性的目标。 2、提出基于编译技术的流敏感、域敏感和上下文敏感的传播引擎框架,通过错误属性格值建模,将软件缺陷检测问题变换为错误属性格值的计算与传播问题。多项式时间的过程内流敏感、域敏感和过程间上下文敏感的错误属性格值计算算法,为提高检测的可扩展性奠定了良好基础。 3、提出两种针对错误检测目标的路径敏感检测策略。通过有效缩小路径敏感分析的输入规模,显著提高了路径敏感检测的可扩展性。策略一对可能触发状态的错误目标实施错误目标制导的程序切片,极大地降低了路径敏感分析的开销。策略二基于可能触发错误目标的危险路径提取及路径可行性判定,实现了极小化输入的路径敏感检测。 4、在开放源码编译器Open64中实现了上述目标的原型系统Minerva。通过应用广泛、程序规模超百万行的实验用例验证,对空指针引用错误、未赋值引用错误、内存泄漏等错误进行实例研究,与先进的路径敏感检测工具Saturn、Clang-SA以及路径不敏感的Splint等工具进行对比,结果表明对于本文实验用例,Minerva不仅在检测时间上具有优势,而且Minerva的误报率均低于各对比系统,并且没有漏报已知错误,实现了在保障准确性的同时改善可扩展性的目标。