遇到代码缺陷不要慌,立刻教你快速检测和修复

摘要:人类思惟中总存在缺陷,写出的代码同样会存在缺陷,致使软件系统出现不符合预期的行为。本文讨论了软件缺陷的定义、分类、检测和修复。编程

人类思惟中总存在缺陷,写出的代码同样会存在缺陷,致使软件系统出现不符合预期的行为。自动化地检测和修复缺陷是提升软件开发效率和软件质量的重要手段。本文讨论了软件缺陷的定义、分类、检测和修复。机器学习

软件缺陷与其分类

计算机学科中的中文词汇不少是从英文翻译过来的,有时不可以准确地描述或刻画词汇真实的含义。在软件领域,你能想到的和缺陷相关的词汇可能有:bug,defect,fault,error,failure,exception等等。说实话,我一直也没搞懂这些词汇的区别。但理解这些词汇的区别不只仅是文字游戏,也可以帮助咱们理解针对它们的检测和修复技术的不一样。因而我google了一下,但大多文章对这些词汇的定义都不太一致。如下是我比较认同的这些词汇在软件代码上的定义。工具

· Fault/Bug:软件中出现不符合业务逻辑的代码,好比+号写成-号;学习

· Error:软件运行中出现不符合预期的值,好比a的值为2,被计算成3;测试

· Failure:软件与人的交互中出现不符合预期的行为,好比程序崩溃。所以Fault可能致使Error,最终可能致使Failure,注意这里是可能,并非必定;google

· Defect:一种Defect是一类代码自身缺陷的统称(概括),好比内存泄漏。编码

Fault一般须要从Error,Failure中检测到,也就是比较程序的执行结果与预期的规范(Specification)是否吻合。这个过程其实就是debugging(调试)和testing(测试)。Fault也能够称为业务逻辑相关的缺陷。而Defect是代码自己的问题,不依赖于执行结果和预期的规范的一种软件问题,所以Defect一般是经过静态地扫描(不运行)代码来检测的。spa

缺陷的检测和修复现状

从上文能够看到,Fault是经过测试来检测的,而Defect是经过静态分析来检测。在企业中,Fault检测的普及率和承认度一般比Defect检测的高,主要缘由有以下几点:翻译

(1)Fault会直接影响软件的行为,被视为比较严重的问题,而不少Defect不能直接影响软件的行为,或者在很特殊的场景下才影响软件的行为,开发人员以为无关紧要;debug

(2)Fault引发的软件错误容易被观测,有直接证据证实软件中存在错误,开发人员会倾向去修改,而Defect一般比较难观测;

(3)测试的门槛低一些,测试人员只须要写一些测试脚本就能够,但静态分析须要有程序分析方面技术的积累;

(4)静态分析固有的一些缺点(耗时,误报)引发开发人员的不满。

自动修复方面,这几年在学术界比较热门,慢慢也在企业中开始使用,但目前应该还处于初级阶段。与检测相反,Fault的自动修复难度是比较大的,由于涉及到业务逻辑,须要人工加入一些逻辑,固然最近也有不少学术研究使用机器学习来自动学习Fault的自动修复;而不少的Defect的修复是不须要加入业务逻辑相关的代码,因此自动化程度反而能够达到较高水平,不过目前也没有看到这方面的自动化工具。

Defect的检测和修复的问题和展望

咱们不难发现,Fault的检测已经比较成熟;而Defect的检测受重视程度还不够。之前咱们可能只关注软件的正确性,因此Fault的检测和修复比较受欢迎,但Defect也会影响软件的质量,一样须要受到关注。

最近公司在提倡提高软件工程能力,打造高可信的软件产品,也是强调咱们不只仅要关注软件功能的正确性,也须要关注非功能方面的质量,写出“优美”的代码。所以,Defect的自动检测和修复是一个比较有价值的方向,如下是一些可能作的事情:

(1)对开发人员增强Defect方面的培训,让开发人员了解常见的Defect,在编码时尽可能地避免写出这样的Defect,这比后续的检测和修复付出的代价要少不少。如今公司虽然有不少的编程规范定义不一样的Defect,但开发人员可能并无用心去学习,如何让开发人员意识到Defect的危害是比较关键的;

(2)增强代码的Review的机制。这一点我我的深有体会:没有Review时,写的代码就比较随意,有Review时就会考虑得全面一些,毕竟要给别人看;

(3)Defect的自动检测。对于Fault的检测,人比机器更擅长(好比写测试用例),但对于Defect的检测,机器比人更擅长(好比枚举程序路径),所以Defect的检测是更适合自动化的。目前公司也引入了一些Defect的自动检测工具,如coverity,fortify,findbugs等等,但这些工具一般只是做为黑盒来使用。这样可以覆盖更多的Defect,同时也带来一些问题:一样的Defect实例被不一样工具重复报告出来,新增一些Defect检测规则比较难,处理Defect例外场景比较难。所以,咱们可能须要一个统一的Defect检测工具。

(4)Defect的自动修复。Defect的检测除了耗时和误报外,另外一个不受欢迎的地方是开发人员不知道怎么修复。所以,Defect的自动修复也是提升Defect受重视程度的一个有效途径。并且,相比Fault的自动修复,Defect的自动修复对于机器而言是要简单一些的,由于Defect的类别是有限的能够枚举的,同时Defect的性质是比较形式化不依赖于业务逻辑的。将来但愿能开发出一个统一的Defect修复工具。

本文分享自华为云社区《遇到代码缺陷不要慌,立刻教你快速检测和修复》,原文做者:APTX-486977 。

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索