​有一款正常工作的软件。那么可以说正常工作的软件都是好软件吗?在漫威的《黑豹》电影中有一个场景我深深地看过。

<图 1> 电影《黑豹》的场景
就算做的好,也有进步的空间!
我认为好的软件也是如此。 即使它可以工作并且没有问题,但总是有改进的空间,并且可能存在尚未发现的错误。

在本文中,我们想讨论动态测试无法捕获的错误、静态分析的必要性以及为什么需要修复缺陷。

动态测试不能发现的BUG
有哪些方法可以找到动态测试都没有发现的bug?
​​​
首先,让我们谈谈为什么会出现错误。 产生错误的原因有无数种,但大致可分为以下 4 类。
​​​

  1. 未考虑的案例(缺失需求)
  2. 意外行为(需求被误解)
  3. 异常输入(缺少异常处理)
    4.由于简单的编码错误导致的Bug
    ​​​
    动态测试可以在一定程度上覆盖第1点和第2点。 通过组织良好的需求、100% 的覆盖率和 QA 流程,可以找出大多数bug。 需要我们考虑的是第 3 点和第 4 点,它们很容易被忽略。

    异常输入(缺少异常处理)
    为什么动态测试不能捕捉到异常输入?
    异常输入不能很好地作为动态测试的案例。 如果将其作为动态测试用例,则不会有错误,因为它是预期的输入。​​​
    最简单的例子是除以零或缓冲区溢出等错误。 这类 bug 最大的问题是它们大多发生在软件发布之后。

    单纯由代码编写导致的bug
    动态测试没有检测到哪些编码错误?
    一个典型的例子是内存泄漏。 通常,只有当程序运行时间较长,才会发现内存泄漏。
    ​​​
    动态测试中发现内存泄漏并不容易,需要在开发阶段快速检查结果。 此外,在内存泄漏的情况下,即使找到了相应的错误,也很难找出泄漏发生的代码位置。
    由于异常输入或编码错误,通常出现在软件运行中,而不是在开发中。 为了便于解释,我们将这些错误统称为运行错误。
    ​​​
    接下来,我们来谈谈如何避免运行错误。

    [如何避免运行错误]

    让我们看看需要哪些步骤来防止运行错误。
    最好的方法是获得大量的实践或经验。 经验丰富的开发人员通过大量的编码经验提前考虑运行错误。那么,经验和实践有限的开发人员是否需要针对运行错误进行无防御的开发?
    ​​​
    通常,在开发过程中会执行结对编码、mob 编码和代码评审等过程,以提前预防这些 bug。 但是,如果项目日程紧迫,并且需要将产品快速推向市场,那么实际上并没有太多时间来进行这些活动。 此外,由于经验丰富的开发人员的时间成本很高,因此代码评审、结对编码和mob编码等活动对公司或团队来说效率不高。

    静态分析(Static Analysis)必要的原因

    除了经验丰富的开发人员的活动之外,还有一种低成本的替代方案,那就是静态分析。
    ​​​
    通过执行静态分析,可以毫不费力地避免诸如运行错误之类的错误。静态分析根据经验丰富的开发人员的专业知识或现场已经发生的许多运行错误的案例来创建规则。然后,使用创建的规则对源代码进行分析。源代码静态分析会检查异常输入、程序的流程或在审查中遗漏的代码。这意味着您找到动态测试或代码审查等活动无法发现的bug。
    ​​​
    静态分析不需要执行代码。因为即使在未完成的代码上也可以进行分析,所以可以比动态测试更早地发现错误。与动态测试相比,它还具有在相对较短的时间内发现错误的优势。
    ​​​
    下图是SureSofttech的代表性静态分析解决方案CodeScroll STATIC的执行界面。
    随着在任务关键域中检查编码规则和运行错误(Runtime Error)的重要性增加,该项目规模开始加大。导致静态分析时间和通信成本的增加,使得修复缺陷变得困难。 STATIC 就是为了解决这些问题而开发的解决方案,通过提供一组丰富的编码规则,从而使项目能够高效的进行。

    <图 2> CODESCROLL STATIC memory leak BUG检出结果画面

    <图 3> CODESCROLL STATIC Buffer Overrun 检出画面
    让我们看看我们需要静态分析的其他原因。
    ​​​
    正如本文开头所提到的,即使是运行良好的软件也有改进的空间。静态分析不仅能发现bug,还能发现有改进空间的代码。
    静态分析还提供有关编码风格的规则和代码质量度量。
    ​​​
    编码风格规则检查是否按照编程语言提供的规则或公司设置的规则进行编程。由于这些规则是考虑到代码的维护和可读性而制定的,因此强烈建议遵循它们。
    ​​​
    代码质量度量提供代码的复杂性、可扩展性和可移植性的数字表示。我们可以通过使用质量指标来量化不可见代码的质量,为了定量化数值,我们可以控制我们的工作。如果质量度量管理没有在开发早期应用,成本可能会增加并最终放弃改进。如果您从开发的早期阶段管理质量指标,您可以发布具有低技术债务的产品。

    <图4> CODESCROLL STATIC Metric 画面
    动态测试 VS 静态测试
    动态测试是最昂贵的测试方法之一。 随着源代码的增加和越来越复杂,需要维护的测试代码的数量也在增加。 另外,由于测试代码也是一个编码过程,自然会出现错误,测试代码中的错误极大地影响了产品的质量。
    ​​​
    当然,动态和静态测试发现的 bug 的类型和性质略有不同。 最好同时进行这两项活动,但是… . 如果您必须以相同的时间和成本在两个测试之间进行选择,我会毫不犹豫地推荐静态分析。

    尽可能修改
    我们经常看到进行静态分析而源代码没有进行相应修改的情况。在某些情况下,它会被跳过,因为它是微不足道的部分,或者因为它是与程序运行无关的缺陷。虽然考虑修复的时间和成本很重要,但尽可能修复代码以减少所有故障。
    ​​​
    经验丰富的开发人员犯的错误更少。因为经验与习惯有关,而习惯来自于重复。不断修复错误代码对产品有好处,但也有助于开发者人员的编码习惯。我认为有经验的开发者都是有良好习惯的开发者。让我们假设静态分析不是一项繁琐的任务,而是帮助开发人员提高技能并推进他们的职业生涯。如果有一天,我第一次在静态分析器上运行代码,它的缺陷为零,那不是很好吗?静态分析和缺陷修复对开发人员比对正在发布的软件更有利。
    ​​​
    即使制作精良,仍有改进的余地。
    ​​​
    我期待着有一天我可以尽可能地改进它,并使我的经验成为一个不需要静态分析的优秀开发人员。

STATIC和静态分析的必要性相关推荐

  1. 静态检测工具STATIC以及静态分析的必要性

    这一篇向大家介绍的是我司静态检测工具STATIC以及静态分析的必要性.欢迎各位技术大牛发表自己的看法呀! 正常运行的软件就是完美的软件吗? 下图是漫威电影<黑豹>中给小编留下很深印象的场面 ...

  2. ai人工智能可以干什么_什么是情感AI,为什么要关心

    ai人工智能可以干什么 Recently I had the opportunity to attend the inaugural Emotion AI Conference, organized ...

  3. 软件动态分析喝静态分析_进行静态分析时,动态分析有什么用?

    软件动态分析喝静态分析 Our team writes a lot about the usefulness of static analysis and the benefits it brings ...

  4. iOS底层探索(二) - 写给小白看的Clang编译过程原理

    iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的.但要想提升技术却始终绕不开 ...

  5. python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  6. 适合新手入门的8个python项目_推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  7. xcode开发html5工具,5个Xcode开发调试技巧

    1.Enable NSZombie Objects(开启僵尸对象) Enable NSZombie Objects可能是整个Xcode开发环境中最有用的调试技巧.这个技巧非常非常容易追踪到重复释放的问 ...

  8. c语言-命令行选项_EWSTM8系列教程06_工程节点选项配置(一)

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 该教程基于EWSTM8,大部分内容也适用于IAR其它产品( ...

  9. 转帖一篇关于DELPHI调试的文章-AQTime

    AQTime教程 1 简介 AQTime和MemProof都是AutomatedQA旗下的产品,AQTime比MemProof提供了更丰富强大的功能.该产品含有完整的性能和调试工具集,能够收集程序运行 ...

最新文章

  1. JSP实现银柜台业务绩效考核系统
  2. SAP FI/CO模块调研问卷
  3. 深入理解JVM(8)——类加载的时机
  4. python批量json文件转xml文件脚本(附代码)
  5. Java EE:异步构造和功能
  6. 【LeetCode】剑指 Offer 58 - II. 左旋转字符串
  7. mysql6.0_MySQL6.0安装
  8. 国内C语言教材中几种值得商榷的说法
  9. 文件和异常——python从编程入门到实践
  10. 服务器路由器无线ap,TP-Link TL-WR841N路由器无线AP设置方法
  11. 一次安装IE11浏览器的经历
  12. bad_pool_caller蓝屏故障分析
  13. html5弹页面腮红,腮红总是打的很奇怪 这里有画腮红的小技巧
  14. ctrl导致开机弹出计算机,电脑开机出现ctrl+alt+del是什么原因及解决方案
  15. 欧拉图简述---(一笔画问题)
  16. 1474:Immediate Decodability
  17. bt面板增加多个站点用同一个IP
  18. TreeMap和LinkedHashMap
  19. vue可视化拖拽组件模板,vue组件拖拽自定义界面
  20. 【游戏作品】SUNSET——动漫风横版动作同人游戏

热门文章

  1. linux增加预读缓存区大小,Linux blockdev命令设置文件预读大小介绍
  2. (转)唯品会订单分库分表的实践总结以及关键步骤
  3. 单元格函数:count、countA、countBlank
  4. 杭电ACM 1174
  5. SDL库及SDL_draw库的安装、SDL库的使用
  6. 五种JavaScript富文本编辑器,总有一款适合你
  7. Docker 入门终极指南,这是我见过最好的教程!
  8. 驱动开发 环境搭建(Win7-VS2008+WDK+DDKWzard)
  9. 李笑来——关于资本(阅读总结)
  10. HTML5期末大作业:电影网站设计——指环王:护戒使者(13页) HTML+CSS+JavaScript