● 摘要
软件代码的质量直接关系到软件功能的可实现性、运行的可靠性、系统的健壮性,以及代码的可维护性等诸多方面。从代码质量的角度讲,程序代码不仅要确保语法和语义的正确性,同时还需保证其在数据访问,对标准的遵循,以及编程风格等方面的规范性,对于面向对象程序语言编写的代码,还需保证类设计和接口定义的合理性。因此,在编写代码的过程中及时发现并清除代码缺陷,是提高软件质量和开发效率的重要保证,采用代码缺陷自动检测技术是发现代码缺陷的重要手段之一。本文分析了传统缺陷检测技术的特点及不足,对国内外的研究现状进行了调研并对目前流行的缺陷检测工具进行了研究和总结,发现了目前研究中在缺陷检测的准确性和缺陷规则的扩展机制方面都存在一定的不足。与此同时,本文从《C++标准》和《Effective C++》等权威著作中整理归纳了40条缺陷规则,为缺陷检测技术的研究和改进奠定了基础。本文采用两种方式进行缺陷检测,并实现了与这两种检测方式相对应的缺陷规则扩展机制。一种方式基于抽象语法树的遍历,本文通过Eclipse平台的CDT插件获取C++代码对应的抽象语法树,掌握了该语法树语法信息的组织方式和使用方法,并对语法信息进行重组,使它能够有效应用于检测缺陷,同时对语法树访问者的结构进行改造,提高了语法树遍历的效率;另一种是借鉴QESAT2.3中检测Java代码缺陷的工具采用的XPath检索技术,本文对这种技术的使用进行了改进,通过反射机制与XPath检索技术相结合,提高了XPath表达式描述缺陷规则的能力。基于Eclipse平台,本文自主研发了一个C++代码缺陷检测工具CDD。本文对CDD的总体设计和具体实现作了详细介绍,包括CDD与QESAT2.3中检测Java代码缺陷的Pisces之间的区别,如CDD遍历语法树的效率高于Pisces,描述缺陷规则的能力更强。实验表明,CDD运行健壮,检测的缺陷规则具有实用性,规则扩展机制优于Splint,并通过实验结果分析得出结论,对于同一缺陷规则,采用XPath检索技术的缺陷定位方式的检测效率要高于遍历抽象语法树的方式。